Initial Commit
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
nbproject
|
9
.gitmodules
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
[submodule "protected/modules/feedback"]
|
||||
path = protected/modules/feedback
|
||||
url = git@git.humhub.org:/home/git/humhub-modules-feedback.git
|
||||
[submodule "protected/modules/translation"]
|
||||
path = protected/modules/translation
|
||||
url = git@github.com:humhub/humhub-modules-translation.git
|
||||
[submodule "themes/enoa"]
|
||||
path = themes/enoa
|
||||
url = git@git.humhub.org:/home/git/humhub-themes-enoa.git
|
9
.htaccess
Normal file
@ -0,0 +1,9 @@
|
||||
RewriteEngine on
|
||||
|
||||
# if a directory or a file exists, use it directly
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
|
||||
# otherwise forward it to index.php
|
||||
RewriteRule . index.php
|
||||
|
661
LICENSE
@ -1,661 +0,0 @@
|
||||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
16
README.md
@ -1,4 +1,14 @@
|
||||
humhub
|
||||
======
|
||||
Welcome to HumHub
|
||||
=================
|
||||
|
||||
HumHub is an opensource social network application written in PHP.
|
||||
|
||||
- <a href="http://demo.humhub.org" target="_blank">**Demo**</a>
|
||||
|
||||
- <a href="protected/docs/guide/administration/index.md">Installation & Admin Documentation</a>
|
||||
- <a href="protected/docs/guide/developer/index.md">Developer Documentation</a>
|
||||
- <a href="protected/docs/guide/theming/index.md">Theming Documentation</a>
|
||||
|
||||
|
||||
- <a href="protected/docs/license.md">License: Dual license AGPL v3 / Proprietary</a>
|
||||
|
||||
HumHub - OpenSource Social Network
|
||||
|
0
assets/empty.txt
Normal file
102
css/bootstrap-wysihtml5.css
vendored
Normal file
@ -0,0 +1,102 @@
|
||||
ul.wysihtml5-toolbar {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar::after {
|
||||
clear: both;
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar > li {
|
||||
float: left;
|
||||
display: list-item;
|
||||
list-style: none;
|
||||
margin: 0 5px 10px 0;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a[data-wysihtml5-command=bold] {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a[data-wysihtml5-command=italic] {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a[data-wysihtml5-command=underline] {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a.btn.wysihtml5-command-active {
|
||||
background-image: none;
|
||||
-webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
-moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);
|
||||
background-color: #E6E6E6;
|
||||
background-color: #D9D9D9;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
ul.wysihtml5-commands-disabled .dropdown-menu {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div.wysihtml5-colors {
|
||||
display:block;
|
||||
width: 50px;
|
||||
height: 20px;
|
||||
margin-top: 2px;
|
||||
margin-left: 5px;
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar a.wysihtml5-colors-title {
|
||||
padding-left: 70px;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="black"] {
|
||||
background: black !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="silver"] {
|
||||
background: silver !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="gray"] {
|
||||
background: gray !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="maroon"] {
|
||||
background: maroon !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="red"] {
|
||||
background: red !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="purple"] {
|
||||
background: purple !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="green"] {
|
||||
background: green !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="olive"] {
|
||||
background: olive !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="navy"] {
|
||||
background: navy !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="blue"] {
|
||||
background: blue !important;
|
||||
}
|
||||
|
||||
ul.wysihtml5-toolbar div[data-wysihtml5-command-value="orange"] {
|
||||
background: orange !important;
|
||||
}
|
9
css/bootstrap.min.css
vendored
Normal file
67
css/bootstrap3-wysiwyg5-color.css
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
.wysiwyg-color-black {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.wysiwyg-color-silver {
|
||||
color: silver;
|
||||
}
|
||||
|
||||
.wysiwyg-color-gray {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.wysiwyg-color-white {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.wysiwyg-color-maroon {
|
||||
color: maroon;
|
||||
}
|
||||
|
||||
.wysiwyg-color-red {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.wysiwyg-color-purple {
|
||||
color: purple;
|
||||
}
|
||||
|
||||
.wysiwyg-color-fuchsia {
|
||||
color: fuchsia;
|
||||
}
|
||||
|
||||
.wysiwyg-color-green {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.wysiwyg-color-lime {
|
||||
color: lime;
|
||||
}
|
||||
|
||||
.wysiwyg-color-olive {
|
||||
color: olive;
|
||||
}
|
||||
|
||||
.wysiwyg-color-yellow {
|
||||
color: yellow;
|
||||
}
|
||||
|
||||
.wysiwyg-color-navy {
|
||||
color: navy;
|
||||
}
|
||||
|
||||
.wysiwyg-color-blue {
|
||||
color: blue;
|
||||
}
|
||||
|
||||
.wysiwyg-color-teal {
|
||||
color: teal;
|
||||
}
|
||||
|
||||
.wysiwyg-color-aqua {
|
||||
color: aqua;
|
||||
}
|
||||
|
||||
.wysiwyg-color-orange {
|
||||
color: orange;
|
||||
}
|
481
css/datepicker.css
Normal file
@ -0,0 +1,481 @@
|
||||
/*!
|
||||
* Datepicker for Bootstrap
|
||||
*
|
||||
* Copyright 2012 Stefan Petre
|
||||
* Improvements by Andrew Rowls
|
||||
* Licensed under the Apache License v2.0
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*/
|
||||
.datepicker {
|
||||
padding: 4px;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
direction: ltr;
|
||||
/*.dow {
|
||||
border-top: 1px solid #ddd !important;
|
||||
}*/
|
||||
|
||||
}
|
||||
.datepicker-inline {
|
||||
width: 220px;
|
||||
}
|
||||
.datepicker.datepicker-rtl {
|
||||
direction: rtl;
|
||||
}
|
||||
.datepicker.datepicker-rtl table tr td span {
|
||||
float: right;
|
||||
}
|
||||
.datepicker-dropdown {
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.datepicker-dropdown:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 7px solid transparent;
|
||||
border-right: 7px solid transparent;
|
||||
border-bottom: 7px solid #ccc;
|
||||
border-top: 0;
|
||||
border-bottom-color: rgba(0, 0, 0, 0.2);
|
||||
position: absolute;
|
||||
}
|
||||
.datepicker-dropdown:after {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
border-left: 6px solid transparent;
|
||||
border-right: 6px solid transparent;
|
||||
border-bottom: 6px solid #ffffff;
|
||||
border-top: 0;
|
||||
position: absolute;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-left:before {
|
||||
left: 6px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-left:after {
|
||||
left: 7px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-right:before {
|
||||
right: 6px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-right:after {
|
||||
right: 7px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-top:before {
|
||||
top: -7px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-top:after {
|
||||
top: -6px;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-bottom:before {
|
||||
bottom: -7px;
|
||||
border-bottom: 0;
|
||||
border-top: 7px solid #999;
|
||||
}
|
||||
.datepicker-dropdown.datepicker-orient-bottom:after {
|
||||
bottom: -6px;
|
||||
border-bottom: 0;
|
||||
border-top: 6px solid #ffffff;
|
||||
}
|
||||
.datepicker > div {
|
||||
display: none;
|
||||
}
|
||||
.datepicker.days div.datepicker-days {
|
||||
display: block;
|
||||
}
|
||||
.datepicker.months div.datepicker-months {
|
||||
display: block;
|
||||
}
|
||||
.datepicker.years div.datepicker-years {
|
||||
display: block;
|
||||
}
|
||||
.datepicker table {
|
||||
margin: 0;
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.datepicker td,
|
||||
.datepicker th {
|
||||
text-align: center;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
}
|
||||
.table-striped .datepicker table tr td,
|
||||
.table-striped .datepicker table tr th {
|
||||
background-color: transparent;
|
||||
}
|
||||
.datepicker table tr td.day:hover {
|
||||
background: #eeeeee;
|
||||
cursor: pointer;
|
||||
}
|
||||
.datepicker table tr td.old,
|
||||
.datepicker table tr td.new {
|
||||
color: #999999;
|
||||
}
|
||||
.datepicker table tr td.disabled,
|
||||
.datepicker table tr td.disabled:hover {
|
||||
background: none;
|
||||
color: #999999;
|
||||
cursor: default;
|
||||
}
|
||||
.datepicker table tr td.today,
|
||||
.datepicker table tr td.today:hover,
|
||||
.datepicker table tr td.today.disabled,
|
||||
.datepicker table tr td.today.disabled:hover {
|
||||
background-color: #fde19a;
|
||||
background-image: -moz-linear-gradient(top, #fdd49a, #fdf59a);
|
||||
background-image: -ms-linear-gradient(top, #fdd49a, #fdf59a);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fdd49a), to(#fdf59a));
|
||||
background-image: -webkit-linear-gradient(top, #fdd49a, #fdf59a);
|
||||
background-image: -o-linear-gradient(top, #fdd49a, #fdf59a);
|
||||
background-image: linear-gradient(top, #fdd49a, #fdf59a);
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fdd49a', endColorstr='#fdf59a', GradientType=0);
|
||||
border-color: #fdf59a #fdf59a #fbed50;
|
||||
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
||||
color: #000;
|
||||
}
|
||||
.datepicker table tr td.today:hover,
|
||||
.datepicker table tr td.today:hover:hover,
|
||||
.datepicker table tr td.today.disabled:hover,
|
||||
.datepicker table tr td.today.disabled:hover:hover,
|
||||
.datepicker table tr td.today:active,
|
||||
.datepicker table tr td.today:hover:active,
|
||||
.datepicker table tr td.today.disabled:active,
|
||||
.datepicker table tr td.today.disabled:hover:active,
|
||||
.datepicker table tr td.today.active,
|
||||
.datepicker table tr td.today:hover.active,
|
||||
.datepicker table tr td.today.disabled.active,
|
||||
.datepicker table tr td.today.disabled:hover.active,
|
||||
.datepicker table tr td.today.disabled,
|
||||
.datepicker table tr td.today:hover.disabled,
|
||||
.datepicker table tr td.today.disabled.disabled,
|
||||
.datepicker table tr td.today.disabled:hover.disabled,
|
||||
.datepicker table tr td.today[disabled],
|
||||
.datepicker table tr td.today:hover[disabled],
|
||||
.datepicker table tr td.today.disabled[disabled],
|
||||
.datepicker table tr td.today.disabled:hover[disabled] {
|
||||
background-color: #fdf59a;
|
||||
}
|
||||
.datepicker table tr td.today:active,
|
||||
.datepicker table tr td.today:hover:active,
|
||||
.datepicker table tr td.today.disabled:active,
|
||||
.datepicker table tr td.today.disabled:hover:active,
|
||||
.datepicker table tr td.today.active,
|
||||
.datepicker table tr td.today:hover.active,
|
||||
.datepicker table tr td.today.disabled.active,
|
||||
.datepicker table tr td.today.disabled:hover.active {
|
||||
background-color: #fbf069 \9;
|
||||
}
|
||||
.datepicker table tr td.today:hover:hover {
|
||||
color: #000;
|
||||
}
|
||||
.datepicker table tr td.today.active:hover {
|
||||
color: #fff;
|
||||
}
|
||||
.datepicker table tr td.range,
|
||||
.datepicker table tr td.range:hover,
|
||||
.datepicker table tr td.range.disabled,
|
||||
.datepicker table tr td.range.disabled:hover {
|
||||
background: #eeeeee;
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
.datepicker table tr td.range.today,
|
||||
.datepicker table tr td.range.today:hover,
|
||||
.datepicker table tr td.range.today.disabled,
|
||||
.datepicker table tr td.range.today.disabled:hover {
|
||||
background-color: #f3d17a;
|
||||
background-image: -moz-linear-gradient(top, #f3c17a, #f3e97a);
|
||||
background-image: -ms-linear-gradient(top, #f3c17a, #f3e97a);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f3c17a), to(#f3e97a));
|
||||
background-image: -webkit-linear-gradient(top, #f3c17a, #f3e97a);
|
||||
background-image: -o-linear-gradient(top, #f3c17a, #f3e97a);
|
||||
background-image: linear-gradient(top, #f3c17a, #f3e97a);
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f3c17a', endColorstr='#f3e97a', GradientType=0);
|
||||
border-color: #f3e97a #f3e97a #edde34;
|
||||
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
||||
-webkit-border-radius: 0;
|
||||
-moz-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
.datepicker table tr td.range.today:hover,
|
||||
.datepicker table tr td.range.today:hover:hover,
|
||||
.datepicker table tr td.range.today.disabled:hover,
|
||||
.datepicker table tr td.range.today.disabled:hover:hover,
|
||||
.datepicker table tr td.range.today:active,
|
||||
.datepicker table tr td.range.today:hover:active,
|
||||
.datepicker table tr td.range.today.disabled:active,
|
||||
.datepicker table tr td.range.today.disabled:hover:active,
|
||||
.datepicker table tr td.range.today.active,
|
||||
.datepicker table tr td.range.today:hover.active,
|
||||
.datepicker table tr td.range.today.disabled.active,
|
||||
.datepicker table tr td.range.today.disabled:hover.active,
|
||||
.datepicker table tr td.range.today.disabled,
|
||||
.datepicker table tr td.range.today:hover.disabled,
|
||||
.datepicker table tr td.range.today.disabled.disabled,
|
||||
.datepicker table tr td.range.today.disabled:hover.disabled,
|
||||
.datepicker table tr td.range.today[disabled],
|
||||
.datepicker table tr td.range.today:hover[disabled],
|
||||
.datepicker table tr td.range.today.disabled[disabled],
|
||||
.datepicker table tr td.range.today.disabled:hover[disabled] {
|
||||
background-color: #f3e97a;
|
||||
}
|
||||
.datepicker table tr td.range.today:active,
|
||||
.datepicker table tr td.range.today:hover:active,
|
||||
.datepicker table tr td.range.today.disabled:active,
|
||||
.datepicker table tr td.range.today.disabled:hover:active,
|
||||
.datepicker table tr td.range.today.active,
|
||||
.datepicker table tr td.range.today:hover.active,
|
||||
.datepicker table tr td.range.today.disabled.active,
|
||||
.datepicker table tr td.range.today.disabled:hover.active {
|
||||
background-color: #efe24b \9;
|
||||
}
|
||||
.datepicker table tr td.selected,
|
||||
.datepicker table tr td.selected:hover,
|
||||
.datepicker table tr td.selected.disabled,
|
||||
.datepicker table tr td.selected.disabled:hover {
|
||||
background-color: #9e9e9e;
|
||||
background-image: -moz-linear-gradient(top, #b3b3b3, #808080);
|
||||
background-image: -ms-linear-gradient(top, #b3b3b3, #808080);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#b3b3b3), to(#808080));
|
||||
background-image: -webkit-linear-gradient(top, #b3b3b3, #808080);
|
||||
background-image: -o-linear-gradient(top, #b3b3b3, #808080);
|
||||
background-image: linear-gradient(top, #b3b3b3, #808080);
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#b3b3b3', endColorstr='#808080', GradientType=0);
|
||||
border-color: #808080 #808080 #595959;
|
||||
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
||||
color: #fff;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.datepicker table tr td.selected:hover,
|
||||
.datepicker table tr td.selected:hover:hover,
|
||||
.datepicker table tr td.selected.disabled:hover,
|
||||
.datepicker table tr td.selected.disabled:hover:hover,
|
||||
.datepicker table tr td.selected:active,
|
||||
.datepicker table tr td.selected:hover:active,
|
||||
.datepicker table tr td.selected.disabled:active,
|
||||
.datepicker table tr td.selected.disabled:hover:active,
|
||||
.datepicker table tr td.selected.active,
|
||||
.datepicker table tr td.selected:hover.active,
|
||||
.datepicker table tr td.selected.disabled.active,
|
||||
.datepicker table tr td.selected.disabled:hover.active,
|
||||
.datepicker table tr td.selected.disabled,
|
||||
.datepicker table tr td.selected:hover.disabled,
|
||||
.datepicker table tr td.selected.disabled.disabled,
|
||||
.datepicker table tr td.selected.disabled:hover.disabled,
|
||||
.datepicker table tr td.selected[disabled],
|
||||
.datepicker table tr td.selected:hover[disabled],
|
||||
.datepicker table tr td.selected.disabled[disabled],
|
||||
.datepicker table tr td.selected.disabled:hover[disabled] {
|
||||
background-color: #808080;
|
||||
}
|
||||
.datepicker table tr td.selected:active,
|
||||
.datepicker table tr td.selected:hover:active,
|
||||
.datepicker table tr td.selected.disabled:active,
|
||||
.datepicker table tr td.selected.disabled:hover:active,
|
||||
.datepicker table tr td.selected.active,
|
||||
.datepicker table tr td.selected:hover.active,
|
||||
.datepicker table tr td.selected.disabled.active,
|
||||
.datepicker table tr td.selected.disabled:hover.active {
|
||||
background-color: #666666 \9;
|
||||
}
|
||||
.datepicker table tr td.active,
|
||||
.datepicker table tr td.active:hover,
|
||||
.datepicker table tr td.active.disabled,
|
||||
.datepicker table tr td.active.disabled:hover {
|
||||
background-color: #006dcc;
|
||||
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
|
||||
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: linear-gradient(top, #0088cc, #0044cc);
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
|
||||
border-color: #0044cc #0044cc #002a80;
|
||||
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
||||
color: #fff;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.datepicker table tr td.active:hover,
|
||||
.datepicker table tr td.active:hover:hover,
|
||||
.datepicker table tr td.active.disabled:hover,
|
||||
.datepicker table tr td.active.disabled:hover:hover,
|
||||
.datepicker table tr td.active:active,
|
||||
.datepicker table tr td.active:hover:active,
|
||||
.datepicker table tr td.active.disabled:active,
|
||||
.datepicker table tr td.active.disabled:hover:active,
|
||||
.datepicker table tr td.active.active,
|
||||
.datepicker table tr td.active:hover.active,
|
||||
.datepicker table tr td.active.disabled.active,
|
||||
.datepicker table tr td.active.disabled:hover.active,
|
||||
.datepicker table tr td.active.disabled,
|
||||
.datepicker table tr td.active:hover.disabled,
|
||||
.datepicker table tr td.active.disabled.disabled,
|
||||
.datepicker table tr td.active.disabled:hover.disabled,
|
||||
.datepicker table tr td.active[disabled],
|
||||
.datepicker table tr td.active:hover[disabled],
|
||||
.datepicker table tr td.active.disabled[disabled],
|
||||
.datepicker table tr td.active.disabled:hover[disabled] {
|
||||
background-color: #0044cc;
|
||||
}
|
||||
.datepicker table tr td.active:active,
|
||||
.datepicker table tr td.active:hover:active,
|
||||
.datepicker table tr td.active.disabled:active,
|
||||
.datepicker table tr td.active.disabled:hover:active,
|
||||
.datepicker table tr td.active.active,
|
||||
.datepicker table tr td.active:hover.active,
|
||||
.datepicker table tr td.active.disabled.active,
|
||||
.datepicker table tr td.active.disabled:hover.active {
|
||||
background-color: #003399 \9;
|
||||
}
|
||||
.datepicker table tr td span {
|
||||
display: block;
|
||||
width: 23%;
|
||||
height: 54px;
|
||||
line-height: 54px;
|
||||
float: left;
|
||||
margin: 1%;
|
||||
cursor: pointer;
|
||||
-webkit-border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.datepicker table tr td span:hover {
|
||||
background: #eeeeee;
|
||||
}
|
||||
.datepicker table tr td span.disabled,
|
||||
.datepicker table tr td span.disabled:hover {
|
||||
background: none;
|
||||
color: #999999;
|
||||
cursor: default;
|
||||
}
|
||||
.datepicker table tr td span.active,
|
||||
.datepicker table tr td span.active:hover,
|
||||
.datepicker table tr td span.active.disabled,
|
||||
.datepicker table tr td span.active.disabled:hover {
|
||||
background-color: #006dcc;
|
||||
background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: -ms-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
|
||||
background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: -o-linear-gradient(top, #0088cc, #0044cc);
|
||||
background-image: linear-gradient(top, #0088cc, #0044cc);
|
||||
background-repeat: repeat-x;
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);
|
||||
border-color: #0044cc #0044cc #002a80;
|
||||
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
|
||||
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
||||
color: #fff;
|
||||
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.datepicker table tr td span.active:hover,
|
||||
.datepicker table tr td span.active:hover:hover,
|
||||
.datepicker table tr td span.active.disabled:hover,
|
||||
.datepicker table tr td span.active.disabled:hover:hover,
|
||||
.datepicker table tr td span.active:active,
|
||||
.datepicker table tr td span.active:hover:active,
|
||||
.datepicker table tr td span.active.disabled:active,
|
||||
.datepicker table tr td span.active.disabled:hover:active,
|
||||
.datepicker table tr td span.active.active,
|
||||
.datepicker table tr td span.active:hover.active,
|
||||
.datepicker table tr td span.active.disabled.active,
|
||||
.datepicker table tr td span.active.disabled:hover.active,
|
||||
.datepicker table tr td span.active.disabled,
|
||||
.datepicker table tr td span.active:hover.disabled,
|
||||
.datepicker table tr td span.active.disabled.disabled,
|
||||
.datepicker table tr td span.active.disabled:hover.disabled,
|
||||
.datepicker table tr td span.active[disabled],
|
||||
.datepicker table tr td span.active:hover[disabled],
|
||||
.datepicker table tr td span.active.disabled[disabled],
|
||||
.datepicker table tr td span.active.disabled:hover[disabled] {
|
||||
background-color: #0044cc;
|
||||
}
|
||||
.datepicker table tr td span.active:active,
|
||||
.datepicker table tr td span.active:hover:active,
|
||||
.datepicker table tr td span.active.disabled:active,
|
||||
.datepicker table tr td span.active.disabled:hover:active,
|
||||
.datepicker table tr td span.active.active,
|
||||
.datepicker table tr td span.active:hover.active,
|
||||
.datepicker table tr td span.active.disabled.active,
|
||||
.datepicker table tr td span.active.disabled:hover.active {
|
||||
background-color: #003399 \9;
|
||||
}
|
||||
.datepicker table tr td span.old,
|
||||
.datepicker table tr td span.new {
|
||||
color: #999999;
|
||||
}
|
||||
.datepicker th.datepicker-switch {
|
||||
width: 145px;
|
||||
}
|
||||
.datepicker thead tr:first-child th,
|
||||
.datepicker tfoot tr th {
|
||||
cursor: pointer;
|
||||
}
|
||||
.datepicker thead tr:first-child th:hover,
|
||||
.datepicker tfoot tr th:hover {
|
||||
background: #eeeeee;
|
||||
}
|
||||
.datepicker .cw {
|
||||
font-size: 10px;
|
||||
width: 12px;
|
||||
padding: 0 2px 0 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.datepicker thead tr:first-child th.cw {
|
||||
cursor: default;
|
||||
background-color: transparent;
|
||||
}
|
||||
.input-group.date .input-group-addon i,
|
||||
.input-group.date .input-group-addon i {
|
||||
display: block;
|
||||
cursor: pointer;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
.input-daterange input {
|
||||
text-align: center;
|
||||
}
|
||||
.input-daterange input:first-child {
|
||||
-webkit-border-radius: 3px 0 0 3px;
|
||||
-moz-border-radius: 3px 0 0 3px;
|
||||
border-radius: 3px 0 0 3px;
|
||||
}
|
||||
.input-daterange input:last-child {
|
||||
-webkit-border-radius: 0 3px 3px 0;
|
||||
-moz-border-radius: 0 3px 3px 0;
|
||||
border-radius: 0 3px 3px 0;
|
||||
}
|
||||
.input-daterange .add-on {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
min-width: 16px;
|
||||
height: 18px;
|
||||
padding: 4px 5px;
|
||||
font-weight: normal;
|
||||
line-height: 18px;
|
||||
text-align: center;
|
||||
text-shadow: 0 1px 0 #ffffff;
|
||||
vertical-align: middle;
|
||||
background-color: #eeeeee;
|
||||
border: 1px solid #ccc;
|
||||
margin-left: -5px;
|
||||
margin-right: -5px;
|
||||
}
|
39
css/ie.css
Normal file
@ -0,0 +1,39 @@
|
||||
.hideInIE8 {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.navbar-inner {
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.box,
|
||||
.discussions ul li {
|
||||
border-top: none;
|
||||
border-left: 1px solid #e4e6eb;
|
||||
border-right: 1px solid #e4e6eb;
|
||||
border-bottom: 2px solid #e4e6eb;
|
||||
}
|
||||
|
||||
a.brand {
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
}
|
||||
.container-fluid-full {
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
height: 100%;
|
||||
}
|
||||
.container-fluid-full #content {
|
||||
width: 85.578%;
|
||||
padding: 28px;
|
||||
margin: 0px 0px;
|
||||
margin-left: 14.422% !important;
|
||||
}
|
||||
.container-fluid-full #sidebar-left {
|
||||
margin-left: 0px !important;
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
}
|
||||
footer {
|
||||
position: relative;
|
||||
}
|
86
css/ie9.css
Normal file
@ -0,0 +1,86 @@
|
||||
.navbar-inner {
|
||||
filter: none;
|
||||
}
|
||||
|
||||
.dark {
|
||||
right: -17px;
|
||||
}
|
||||
|
||||
.verticalChart .singleBar .bar .value span{
|
||||
color: #3b3b41;
|
||||
}
|
||||
|
||||
hr {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIwLjI1Ii8+CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2Y5ZjlmOSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmOWY5ZjkiIHN0b3Atb3BhY2l0eT0iMC4yNSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.box-header {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNGY0ZjQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.btn3d:before {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ViZWFlOCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.login-box {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y1ZjVmNSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjE5JSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9Ijc3JSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNWY1ZjUiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderOverlay,
|
||||
.progressBarOverlay {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ViZWFlOCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.slider {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmYWZhZmEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderVertical {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIxJSIgc3RvcC1jb2xvcj0iI2ViZWFlOCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZmZmZmYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderBlue .ui-slider-range, .progressBlue .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzY3YzJlZiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMyZmFiZTkiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderGreen .ui-slider-range, .progressGreen .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2JkZWE3NCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNiNmUzNzAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderDarkGreen .ui-slider-range, .progressDarkGreen .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzc4Y2Q1MSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiM1YWFkMzQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderPink .ui-slider-range, .progressPink .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U4NGM4YSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlMjE2NjgiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderOrange .ui-slider-range, .progressOrange .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhNjAzZCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmYTU4MzMiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderLightOrange .ui-slider-range, .progressLightOrange .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhYmIzZCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmNGE1MDYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderRed .ui-slider-range, .progressRed .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmNTQ1NCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmZjAwMDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.sliderYellow .ui-slider-range, .progressYellow .ui-progressbar-value {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZTg3NCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlM2UyNzAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.progress {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmYWZhZmEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.progressSlim {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZjZmNmYyIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNmYWZhZmEiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
}
|
||||
|
||||
.quick-button,
|
||||
.quick-button-small {
|
||||
background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIwJSIgeTI9IjEwMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZhZmFmYSIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlZmVmZWYiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+);
|
||||
|
||||
}
|
459
css/style.css
Normal file
@ -0,0 +1,459 @@
|
||||
/*
|
||||
|
||||
HumHub Style CSS
|
||||
Author: Andreas Strobel
|
||||
Website: http://www.humhub.org
|
||||
|
||||
|
||||
Table of Bootstrap modifications:
|
||||
---------------------------------------------
|
||||
1) General
|
||||
2) Topbar (replaces the Bootstrap Navbar)
|
||||
3) Navs (Nav-Tabs & Nav-Pills)
|
||||
4) Media Object
|
||||
5) Panels
|
||||
6) Pagination
|
||||
7) Yii Components
|
||||
8) HumHub Components
|
||||
9) Third Party Tools
|
||||
10) Responsive modifications
|
||||
|
||||
*/
|
||||
body {
|
||||
padding-top: 130px;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
hr {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.col-md-1,
|
||||
.col-md-2,
|
||||
.col-md-3,
|
||||
.col-md-4,
|
||||
.col-md-5,
|
||||
.col-md-6,
|
||||
.col-md-7,
|
||||
.col-md-8,
|
||||
.col-md-9,
|
||||
.col-md-10,
|
||||
.col-md-11,
|
||||
.col-md-12 {
|
||||
position: inherit;
|
||||
}
|
||||
.topbar {
|
||||
position: fixed;
|
||||
display: block;
|
||||
height: 50px;
|
||||
width: 100%;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
.topbar ul.nav {
|
||||
float: left;
|
||||
}
|
||||
.topbar ul.nav > li {
|
||||
float: left;
|
||||
}
|
||||
.topbar ul.nav > li > a {
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
line-height: 20px;
|
||||
}
|
||||
.topbar .dropdown-footer {
|
||||
margin: 10px;
|
||||
}
|
||||
#topbar-first {
|
||||
top: 0;
|
||||
background-color: #101010;
|
||||
z-index: 1030;
|
||||
}
|
||||
#topbar-first .nav > li > a:hover,
|
||||
#topbar-first .nav > .open > a {
|
||||
background-color: #2a2a2a;
|
||||
}
|
||||
#topbar-first .nav > .account {
|
||||
height: 50px;
|
||||
margin-left: 20px;
|
||||
}
|
||||
#topbar-first .nav > .account img {
|
||||
margin-left: 10px;
|
||||
}
|
||||
#topbar-first .nav > .account .dropdown-toggle {
|
||||
padding: 10px 5px 8px 5px;
|
||||
line-height: 1.1em;
|
||||
text-align: left;
|
||||
}
|
||||
#topbar-first .nav > .account .dropdown-toggle span {
|
||||
font-size: 12px;
|
||||
}
|
||||
#topbar-first .topbar-brand {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
#topbar-first .topbar-actions {
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
}
|
||||
#topbar-first .notifications {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
z-index: 1;
|
||||
}
|
||||
#topbar-first .notifications .btn-group {
|
||||
position: relative;
|
||||
text-align: left;
|
||||
}
|
||||
#topbar-first .notifications .btn-group > a {
|
||||
padding: 5px 10px;
|
||||
margin: 10px 2px;
|
||||
display: inline-block;
|
||||
border-radius: 2px;
|
||||
text-decoration: none;
|
||||
text-align: left;
|
||||
}
|
||||
#topbar-first .notifications .btn-group > .label {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: -2px;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications {
|
||||
width: 350px;
|
||||
margin-left: -148px;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications li {
|
||||
position: relative;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications li i.approval {
|
||||
position: absolute;
|
||||
left: 6px;
|
||||
top: 35px;
|
||||
font-size: 14px;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications li i.accepted {
|
||||
color: #5cb85c;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications li i.declined {
|
||||
color: #d9534f;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications li .media {
|
||||
position: relative;
|
||||
}
|
||||
#topbar-first .notifications #dropdown-notifications li .media .img-space {
|
||||
position: absolute;
|
||||
top: 14px;
|
||||
left: 14px;
|
||||
}
|
||||
#topbar-second {
|
||||
top: 50px;
|
||||
background-color: #f8f8f8;
|
||||
z-index: 1029;
|
||||
}
|
||||
#topbar-second .dropdown-menu {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
#topbar-second #space-menu-dropdown,
|
||||
#topbar-second #search-menu-dropdown {
|
||||
width: 400px;
|
||||
}
|
||||
#topbar-second #space-menu-dropdown .media-list,
|
||||
#topbar-second #search-menu-dropdown .media-list {
|
||||
max-height: 400px;
|
||||
overflow: auto;
|
||||
}
|
||||
#topbar-second #space-menu-dropdown form,
|
||||
#topbar-second #search-menu-dropdown form {
|
||||
margin: 10px;
|
||||
}
|
||||
#topbar-second #space-menu-dropdown .search-reset,
|
||||
#topbar-second #search-menu-dropdown .search-reset {
|
||||
position: absolute;
|
||||
color: #999;
|
||||
margin: 10px;
|
||||
top: 8px;
|
||||
right: 10px;
|
||||
display: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
.nav-tabs {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.media-list li {
|
||||
padding: 10px;
|
||||
border-bottom: 1px solid #eee;
|
||||
position: relative;
|
||||
}
|
||||
.media-list li:hover,
|
||||
.media-list li.selected {
|
||||
background-color: #eee;
|
||||
}
|
||||
.panel .statistics {
|
||||
margin-top: 40px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
.panel .statistics .entry {
|
||||
margin-left: 20px;
|
||||
}
|
||||
.panel .statistics .entry .count {
|
||||
font-size: 30px;
|
||||
}
|
||||
.panel.profile {
|
||||
position: relative;
|
||||
}
|
||||
.panel.profile .controls {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
}
|
||||
.panel.members .panel-body a img,
|
||||
.panel.groups .panel-body a img,
|
||||
.panel.follower .panel-body a img,
|
||||
.panel.spaces .panel-body a img {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.pagination-container {
|
||||
text-align: center;
|
||||
}
|
||||
.grid-view img {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
.errorMessage {
|
||||
color: red;
|
||||
padding: 10px 0;
|
||||
}
|
||||
.error {
|
||||
border-color: red !important;
|
||||
}
|
||||
.loader {
|
||||
height: 60px;
|
||||
background: url('../img/loader.gif') no-repeat center center;
|
||||
}
|
||||
.loader-small {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
ul.tag_input {
|
||||
list-style: none;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||
-webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
||||
transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
|
||||
padding: 0 0 9px 4px;
|
||||
}
|
||||
ul.tag_input li img {
|
||||
margin: 0 5px 0 0;
|
||||
}
|
||||
.tag_input_field {
|
||||
outline: none;
|
||||
border: none !important;
|
||||
padding: 5px 4px 0px 4px !important;
|
||||
width: 170px;
|
||||
margin: 2px 0 0 0 !important;
|
||||
}
|
||||
.userInput,
|
||||
.spaceInput {
|
||||
background-color: #428bca;
|
||||
color: #ffffff;
|
||||
border-radius: 3px;
|
||||
font-size: 12px !important;
|
||||
padding: 2px;
|
||||
float: left;
|
||||
margin: 4px 4px 0 0;
|
||||
}
|
||||
.userInput i,
|
||||
.spaceInput i {
|
||||
padding: 0px 6px;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
line-height: 8px;
|
||||
}
|
||||
#userpicker li > a,
|
||||
#spacepicker li > a {
|
||||
padding-left: 10px;
|
||||
}
|
||||
#userpicker li.selected,
|
||||
#spacepicker li.selected {
|
||||
background-color: #eee;
|
||||
}
|
||||
.activities {
|
||||
max-height: 400px;
|
||||
overflow: auto;
|
||||
}
|
||||
.activities li .media {
|
||||
position: relative;
|
||||
}
|
||||
.activities li .media .img-space {
|
||||
position: absolute;
|
||||
top: 14px;
|
||||
left: 14px;
|
||||
}
|
||||
.wall-entry {
|
||||
position: relative;
|
||||
}
|
||||
.wall-entry .media {
|
||||
overflow: visible;
|
||||
}
|
||||
.wall-entry .media .img-space {
|
||||
position: absolute;
|
||||
top: 60px;
|
||||
left: 60px;
|
||||
}
|
||||
.wall-entry .well {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
.wall-entry .well .comment .show-all-link {
|
||||
font-size: 12px;
|
||||
}
|
||||
.media:after {
|
||||
content: '';
|
||||
clear: both;
|
||||
display: block;
|
||||
}
|
||||
.wall-entry .preferences {
|
||||
position: absolute;
|
||||
right: 1px;
|
||||
top: 1px;
|
||||
}
|
||||
.wall-entry-controls {
|
||||
font-size: 12px;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.tags {
|
||||
margin: 5px 0;
|
||||
}
|
||||
.tags .tag {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.placeholder {
|
||||
padding: 15px;
|
||||
}
|
||||
.space-member-sign {
|
||||
color: #5cb85c;
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
left: 50px;
|
||||
font-size: 18px;
|
||||
}
|
||||
.mime {
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 0;
|
||||
}
|
||||
.mime-word {
|
||||
background-image: url('../img/mime/word.png');
|
||||
}
|
||||
.mime-excel {
|
||||
background-image: url('../img/mime/excel.png');
|
||||
}
|
||||
.mime-powerpoint {
|
||||
background-image: url('../img/mime/powerpoint.png');
|
||||
}
|
||||
.mime-pdf {
|
||||
background-image: url('../img/mime/pdf.png');
|
||||
}
|
||||
.mime-zip {
|
||||
background-image: url('../img/mime/zip.png');
|
||||
}
|
||||
.mime-image {
|
||||
background-image: url('../img/mime/image.png');
|
||||
}
|
||||
.mime-file {
|
||||
background-image: url('../img/mime/file.png');
|
||||
}
|
||||
.mime-photoshop {
|
||||
background-image: url('../img/mime/photoshop.png');
|
||||
}
|
||||
.mime-illustrator {
|
||||
background-image: url('../img/mime/illustrator.png');
|
||||
}
|
||||
.mime-flash {
|
||||
background-image: url('../img/mime/flash.png');
|
||||
}
|
||||
.mime-audio {
|
||||
background-image: url('../img/mime/audio.png');
|
||||
}
|
||||
.files {
|
||||
padding-left: 0;
|
||||
}
|
||||
.highlight {
|
||||
background-color: #fffbc1;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.topbar {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
#space-menu > .title {
|
||||
display: none;
|
||||
}
|
||||
#space-menu-dropdown {
|
||||
width: 300px !important;
|
||||
}
|
||||
#search-menu-dropdown {
|
||||
width: 300px !important;
|
||||
}
|
||||
.notifications {
|
||||
position: inherit !important;
|
||||
float: left !important;
|
||||
}
|
||||
#dropdown-notifications {
|
||||
width: 300px !important;
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
.profile .media > a {
|
||||
float: none !important;
|
||||
margin-right: 0;
|
||||
}
|
||||
.profile .media > a img {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.profile .statistics {
|
||||
float: none !important;
|
||||
}
|
||||
/*.wall-entry {
|
||||
|
||||
.media > a {
|
||||
float: none !important;
|
||||
|
||||
img {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.comment .media > a {
|
||||
float: left !important;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.media-body {
|
||||
.media-heading {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
left: 100px;
|
||||
|
||||
small {
|
||||
display: block;
|
||||
padding-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
620
css/style.less
Normal file
@ -0,0 +1,620 @@
|
||||
/*
|
||||
|
||||
HumHub Style CSS
|
||||
Author: Andreas Strobel
|
||||
Website: http://www.humhub.org
|
||||
|
||||
|
||||
Table of Bootstrap modifications:
|
||||
---------------------------------------------
|
||||
1) General
|
||||
2) Topbar (replaces the Bootstrap Navbar)
|
||||
3) Navs (Nav-Tabs & Nav-Pills)
|
||||
4) Media Object
|
||||
5) Panels
|
||||
6) Pagination
|
||||
7) Yii Components
|
||||
8) HumHub Components
|
||||
9) Third Party Tools
|
||||
10) Responsive modifications
|
||||
|
||||
*/
|
||||
|
||||
//
|
||||
// 1) General
|
||||
// --------------------------------------------------
|
||||
|
||||
body {
|
||||
padding-top: 130px;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
// Cols (change position property to prevent the cutting of tooltips or menus)
|
||||
.col-md-1,
|
||||
.col-md-2,
|
||||
.col-md-3,
|
||||
.col-md-4,
|
||||
.col-md-5,
|
||||
.col-md-6,
|
||||
.col-md-7,
|
||||
.col-md-8,
|
||||
.col-md-9,
|
||||
.col-md-10,
|
||||
.col-md-11,
|
||||
.col-md-12 {
|
||||
position: inherit;
|
||||
}
|
||||
|
||||
//
|
||||
// 2) Topbar
|
||||
// --------------------------------------------------
|
||||
.topbar {
|
||||
position: fixed;
|
||||
display: block;
|
||||
height: 50px;
|
||||
width: 100%;
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
|
||||
ul.nav {
|
||||
float: left;
|
||||
}
|
||||
|
||||
ul.nav > li {
|
||||
float: left;
|
||||
}
|
||||
|
||||
ul.nav > li > a {
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.dropdown-footer {
|
||||
margin: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
#topbar-first {
|
||||
top: 0;
|
||||
background-color: #101010;
|
||||
z-index: 1030;
|
||||
|
||||
.nav > li > a:hover, .nav > .open > a {
|
||||
background-color: lighten(#101010, 10%);;
|
||||
}
|
||||
|
||||
.nav > .account {
|
||||
height: 50px;
|
||||
margin-left: 20px;
|
||||
|
||||
img {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.dropdown-toggle {
|
||||
padding: 10px 5px 8px 5px;
|
||||
line-height: 1.1em;
|
||||
text-align: left;
|
||||
|
||||
span {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.topbar-brand {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.topbar-actions {
|
||||
position: relative;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.notifications {
|
||||
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
z-index: 1;
|
||||
|
||||
.btn-group {
|
||||
position: relative;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.btn-group > a {
|
||||
padding: 5px 10px;
|
||||
margin: 10px 2px;
|
||||
display: inline-block;
|
||||
border-radius: 2px;
|
||||
text-decoration: none;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.btn-group > .label {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: -2px;
|
||||
}
|
||||
|
||||
#dropdown-notifications {
|
||||
width: 350px;
|
||||
margin-left: -148px;
|
||||
|
||||
li {
|
||||
|
||||
position: relative;
|
||||
|
||||
i.approval {
|
||||
position: absolute;
|
||||
left: 6px;
|
||||
top: 35px;
|
||||
font-size: 14px;
|
||||
}
|
||||
i.accepted {
|
||||
color: #5cb85c;
|
||||
}
|
||||
|
||||
i.declined {
|
||||
color: #d9534f;
|
||||
}
|
||||
}
|
||||
|
||||
li .media {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li .media .img-space {
|
||||
position: absolute;
|
||||
top: 14px;
|
||||
left: 14px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#topbar-second {
|
||||
top: 50px;
|
||||
background-color: #f8f8f8;
|
||||
z-index: 1029;
|
||||
|
||||
.dropdown-menu {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
// Space dropdown menu
|
||||
#space-menu-dropdown, #search-menu-dropdown {
|
||||
|
||||
width: 400px;
|
||||
|
||||
.media-list {
|
||||
max-height: 400px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
form {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.search-reset {
|
||||
position: absolute;
|
||||
color: #999;
|
||||
margin: 10px;
|
||||
top: 8px;
|
||||
right: 10px;
|
||||
display: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// 3) Navs (Nav-Tabs & Nav-Pills)
|
||||
// --------------------------------------------------
|
||||
.nav-tabs {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
//
|
||||
// 4) Media-Object
|
||||
// --------------------------------------------------
|
||||
.media-list {
|
||||
li {
|
||||
padding: 10px;
|
||||
border-bottom: 1px solid #eee;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li:hover, li.selected {
|
||||
background-color: #eee;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// 5) Panels
|
||||
// --------------------------------------------------
|
||||
|
||||
.panel {
|
||||
|
||||
.statistics {
|
||||
|
||||
margin-top: 40px;
|
||||
margin-right: 20px;
|
||||
|
||||
.entry {
|
||||
margin-left: 20px;
|
||||
|
||||
.count {
|
||||
font-size: 30px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.panel.profile {
|
||||
position: relative;
|
||||
|
||||
.controls {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.panel.members, .panel.groups, .panel.follower, .panel.spaces {
|
||||
.panel-body a img {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// 6) Pagination
|
||||
// --------------------------------------------------
|
||||
.pagination-container {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
//
|
||||
// 7) Yii Components
|
||||
// --------------------------------------------------
|
||||
|
||||
.grid-view {
|
||||
img {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
}
|
||||
|
||||
// Errror handling
|
||||
.errorMessage {
|
||||
color: red;
|
||||
padding: 10px 0;
|
||||
}
|
||||
|
||||
.error {
|
||||
border-color: red !important;
|
||||
}
|
||||
|
||||
//
|
||||
// 8) HumHub Components
|
||||
// --------------------------------------------------
|
||||
|
||||
// Ajax loader
|
||||
.loader {
|
||||
height: 60px;
|
||||
background: url('../img/loader.gif') no-repeat center center;
|
||||
}
|
||||
|
||||
.loader-small {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
// User- & Space picker
|
||||
ul.tag_input {
|
||||
list-style: none;
|
||||
background-color: #ffffff;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
|
||||
-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
|
||||
|
||||
padding: 0 0 9px 4px;
|
||||
|
||||
li img {
|
||||
margin: 0 5px 0 0;
|
||||
}
|
||||
}
|
||||
|
||||
.tag_input_field {
|
||||
outline: none;
|
||||
border: none !important;
|
||||
padding: 5px 4px 0px 4px !important;
|
||||
width: 170px;
|
||||
margin: 2px 0 0 0 !important;
|
||||
}
|
||||
|
||||
.userInput, .spaceInput {
|
||||
background-color: #428bca;
|
||||
color: #ffffff;
|
||||
border-radius: 3px;
|
||||
font-size: 12px !important;
|
||||
padding: 2px;
|
||||
float: left;
|
||||
margin: 4px 4px 0 0;
|
||||
}
|
||||
|
||||
.userInput i, .spaceInput i {
|
||||
padding: 0px 6px;
|
||||
font-size: 14px;
|
||||
cursor: pointer;
|
||||
line-height: 8px;
|
||||
}
|
||||
|
||||
#userpicker, #spacepicker {
|
||||
li > a {
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
li.selected {
|
||||
//padding-left: 6px;
|
||||
background-color: #eee;
|
||||
}
|
||||
}
|
||||
|
||||
// Activities
|
||||
.activities {
|
||||
|
||||
max-height: 400px;
|
||||
overflow: auto;
|
||||
|
||||
li .media {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
li .media .img-space {
|
||||
position: absolute;
|
||||
top: 14px;
|
||||
left: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
// Wall-Entries
|
||||
.wall-entry {
|
||||
position: relative;
|
||||
|
||||
.media {
|
||||
overflow: visible;
|
||||
|
||||
.img-space {
|
||||
position: absolute;
|
||||
top: 60px;
|
||||
left: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
.well {
|
||||
margin-bottom: 0;
|
||||
|
||||
.comment {
|
||||
.show-all-link {
|
||||
font-size: 12px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.media:after {
|
||||
content: '';
|
||||
clear: both;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.wall-entry {
|
||||
.preferences {
|
||||
position: absolute;
|
||||
right: 1px;
|
||||
top: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
.wall-entry-controls {
|
||||
font-size: 12px;
|
||||
margin-top: 10px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
// Tags
|
||||
.tags {
|
||||
|
||||
margin: 5px 0;
|
||||
|
||||
.tag {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
// Placeholder text for empty content
|
||||
.placeholder {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
// Member sign for directory list
|
||||
.space-member-sign {
|
||||
color: #5cb85c;
|
||||
position: absolute;
|
||||
top: 50px;
|
||||
left: 50px;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
|
||||
// Mime-Types
|
||||
.mime {
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 0;
|
||||
|
||||
}
|
||||
|
||||
.mime-word {
|
||||
background-image: url('../img/mime/word.png');
|
||||
}
|
||||
|
||||
.mime-excel {
|
||||
background-image: url('../img/mime/excel.png');
|
||||
}
|
||||
|
||||
.mime-powerpoint {
|
||||
background-image: url('../img/mime/powerpoint.png');
|
||||
}
|
||||
|
||||
.mime-pdf {
|
||||
background-image: url('../img/mime/pdf.png');
|
||||
}
|
||||
|
||||
.mime-zip {
|
||||
background-image: url('../img/mime/zip.png');
|
||||
}
|
||||
|
||||
.mime-image {
|
||||
background-image: url('../img/mime/image.png');
|
||||
}
|
||||
|
||||
.mime-file {
|
||||
background-image: url('../img/mime/file.png');
|
||||
}
|
||||
|
||||
.mime-photoshop {
|
||||
background-image: url('../img/mime/photoshop.png');
|
||||
}
|
||||
|
||||
.mime-illustrator {
|
||||
background-image: url('../img/mime/illustrator.png');
|
||||
}
|
||||
|
||||
.mime-flash {
|
||||
background-image: url('../img/mime/flash.png');
|
||||
}
|
||||
|
||||
.mime-audio {
|
||||
background-image: url('../img/mime/audio.png');
|
||||
}
|
||||
|
||||
.files {
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
//
|
||||
// 9) Third Party Tools
|
||||
// --------------------------------------------------
|
||||
.highlight {
|
||||
background-color: #fffbc1;
|
||||
}
|
||||
|
||||
//
|
||||
// 10) Responsive modifications
|
||||
// --------------------------------------------------
|
||||
@media (max-width: 767px) {
|
||||
|
||||
.topbar {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
#space-menu > .title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#space-menu-dropdown {
|
||||
width: 300px !important;
|
||||
}
|
||||
|
||||
#search-menu-dropdown {
|
||||
width: 300px !important;
|
||||
}
|
||||
|
||||
.notifications {
|
||||
position: inherit !important;
|
||||
float: left !important;
|
||||
}
|
||||
|
||||
#dropdown-notifications {
|
||||
width: 300px !important;
|
||||
margin-left: 0 !important;
|
||||
}
|
||||
|
||||
.profile {
|
||||
|
||||
.media > a {
|
||||
float: none !important;
|
||||
margin-right: 0;
|
||||
|
||||
img {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.statistics {
|
||||
float: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/*.wall-entry {
|
||||
|
||||
.media > a {
|
||||
float: none !important;
|
||||
|
||||
img {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.comment .media > a {
|
||||
float: left !important;
|
||||
|
||||
img {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
.media-body {
|
||||
.media-heading {
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
left: 100px;
|
||||
|
||||
small {
|
||||
display: block;
|
||||
padding-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
margin-top: 20px;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
BIN
ico/apple-touch-icon-114-precomposed.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
ico/apple-touch-icon-144-precomposed.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
ico/apple-touch-icon-57-precomposed.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
ico/apple-touch-icon-72-precomposed.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
ico/favicon.ico
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
img/glyphicons-halflings-white.png
Normal file
After Width: | Height: | Size: 8.6 KiB |
BIN
img/glyphicons-halflings.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
img/loader.gif
Normal file
After Width: | Height: | Size: 673 B |
BIN
img/mime/audio.png
Normal file
After Width: | Height: | Size: 635 B |
BIN
img/mime/excel.png
Normal file
After Width: | Height: | Size: 581 B |
BIN
img/mime/file.png
Normal file
After Width: | Height: | Size: 352 B |
BIN
img/mime/flash.png
Normal file
After Width: | Height: | Size: 544 B |
BIN
img/mime/illustrator.png
Normal file
After Width: | Height: | Size: 507 B |
BIN
img/mime/image.png
Normal file
After Width: | Height: | Size: 528 B |
BIN
img/mime/pdf.png
Normal file
After Width: | Height: | Size: 500 B |
BIN
img/mime/photoshop.png
Normal file
After Width: | Height: | Size: 535 B |
BIN
img/mime/powerpoint.png
Normal file
After Width: | Height: | Size: 449 B |
BIN
img/mime/word.png
Normal file
After Width: | Height: | Size: 535 B |
BIN
img/mime/zip.png
Normal file
After Width: | Height: | Size: 475 B |
39
index.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
$yii = dirname(__FILE__) . '/protected/vendors/yii/yii.php';
|
||||
$config = dirname(__FILE__) . '/protected/config/main.php';
|
||||
$appClass = dirname(__FILE__) . '/protected/components/WebApplication.php';
|
||||
|
||||
// enable the following 3 lines when in development/testing
|
||||
defined('YII_DEBUG') or define('YII_DEBUG', true);
|
||||
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL', 3);
|
||||
ini_set('error_reporting', E_ALL);
|
||||
|
||||
require_once($yii);
|
||||
require_once($appClass);
|
||||
|
||||
$app = Yii::createApplication('WebApplication', $config);
|
||||
|
||||
Yii::import('application.vendors.*');
|
||||
EZendAutoloader::$prefixes = array('Zend', 'Custom');
|
||||
Yii::import("ext.yiiext.components.zendAutoloader.EZendAutoloader", true);
|
||||
Yii::registerAutoloader(array("EZendAutoloader", "loadClass"), true);
|
||||
|
||||
$app->run();
|
132
js/app.js
Normal file
@ -0,0 +1,132 @@
|
||||
/**
|
||||
* Holds all already loaded javascript libaries
|
||||
*
|
||||
* @type HashTable
|
||||
*/
|
||||
var currentLoadedJavaScripts = new HashTable();
|
||||
|
||||
|
||||
/**
|
||||
* Looks for script tags inside the given string and checks if the files
|
||||
* are already loaded.
|
||||
*
|
||||
* When already loaded, the scripts will ignored.
|
||||
*
|
||||
* @returns {undefined}
|
||||
*/
|
||||
function parseHtml(htmlString) {
|
||||
var re = /<script type="text\/javascript" src="([\s\S]*?)"><\/script>/gm;
|
||||
|
||||
var match;
|
||||
while (match = re.exec(htmlString)) {
|
||||
|
||||
js = match[1];
|
||||
|
||||
if (currentLoadedJavaScripts.hasItem(js)) {
|
||||
// Remove Script Tag
|
||||
//console.log("Ignore load of : "+js);
|
||||
htmlString = htmlString.replace(match[0], "");
|
||||
|
||||
} else {
|
||||
// Let Script Tag
|
||||
//console.log("First load of: "+js);
|
||||
currentLoadedJavaScripts.setItem(js, 1);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
return htmlString;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Hashtable
|
||||
*
|
||||
* Javscript Class which represents a hashtable.
|
||||
*
|
||||
* @param {type} obj
|
||||
* @returns {HashTable}
|
||||
*/
|
||||
function HashTable(obj)
|
||||
{
|
||||
this.length = 0;
|
||||
this.items = {};
|
||||
for (var p in obj) {
|
||||
if (obj.hasOwnProperty(p)) {
|
||||
this.items[p] = obj[p];
|
||||
this.length++;
|
||||
}
|
||||
}
|
||||
|
||||
this.setItem = function(key, value)
|
||||
{
|
||||
var previous = undefined;
|
||||
if (this.hasItem(key)) {
|
||||
previous = this.items[key];
|
||||
}
|
||||
else {
|
||||
this.length++;
|
||||
}
|
||||
this.items[key] = value;
|
||||
return previous;
|
||||
}
|
||||
|
||||
this.getItem = function(key) {
|
||||
return this.hasItem(key) ? this.items[key] : undefined;
|
||||
}
|
||||
|
||||
this.hasItem = function(key)
|
||||
{
|
||||
return this.items.hasOwnProperty(key);
|
||||
}
|
||||
|
||||
this.removeItem = function(key)
|
||||
{
|
||||
if (this.hasItem(key)) {
|
||||
previous = this.items[key];
|
||||
this.length--;
|
||||
delete this.items[key];
|
||||
return previous;
|
||||
}
|
||||
else {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
this.keys = function()
|
||||
{
|
||||
var keys = [];
|
||||
for (var k in this.items) {
|
||||
if (this.hasItem(k)) {
|
||||
keys.push(k);
|
||||
}
|
||||
}
|
||||
return keys;
|
||||
}
|
||||
|
||||
this.values = function()
|
||||
{
|
||||
var values = [];
|
||||
for (var k in this.items) {
|
||||
if (this.hasItem(k)) {
|
||||
values.push(this.items[k]);
|
||||
}
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
this.each = function(fn) {
|
||||
for (var k in this.items) {
|
||||
if (this.hasItem(k)) {
|
||||
fn(k, this.items[k]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
this.clear = function()
|
||||
{
|
||||
this.items = {}
|
||||
this.length = 0;
|
||||
}
|
||||
}
|
1396
js/bootstrap-datepicker.js
vendored
Normal file
9
js/bootstrap.min.js
vendored
Normal file
521
js/bootstrap3-wysihtml5.js
vendored
Normal file
@ -0,0 +1,521 @@
|
||||
!function($, wysi) {
|
||||
"use strict";
|
||||
|
||||
var tpl = {
|
||||
"font-styles": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li class='dropdown'>" +
|
||||
"<a class='btn dropdown-toggle btn-" + size + " btn-default' data-toggle='dropdown' href='#'>" +
|
||||
"<i class='glyphicon glyphicon-font'></i> <span class='current-font'>" + locale.font_styles.normal + "</span> <b class='caret'></b>" +
|
||||
"</a>" +
|
||||
"<ul class='dropdown-menu'>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='div' tabindex='-1'>" + locale.font_styles.normal + "</a></li>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h1' tabindex='-1'>" + locale.font_styles.h1 + "</a></li>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h2' tabindex='-1'>" + locale.font_styles.h2 + "</a></li>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h3' tabindex='-1'>" + locale.font_styles.h3 + "</a></li>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h4'>" + locale.font_styles.h4 + "</a></li>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h5'>" + locale.font_styles.h5 + "</a></li>" +
|
||||
"<li><a data-wysihtml5-command='formatBlock' data-wysihtml5-command-value='h6'>" + locale.font_styles.h6 + "</a></li>" +
|
||||
"</ul>" +
|
||||
"</li>";
|
||||
},
|
||||
|
||||
"emphasis": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li>" +
|
||||
"<div class='btn-group'>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='bold' title='CTRL+B' tabindex='-1'>" + locale.emphasis.bold + "</a>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='italic' title='CTRL+I' tabindex='-1'>" + locale.emphasis.italic + "</a>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='underline' title='CTRL+U' tabindex='-1'>" + locale.emphasis.underline + "</a>" +
|
||||
"</div>" +
|
||||
"</li>";
|
||||
},
|
||||
|
||||
"lists": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li>" +
|
||||
"<div class='btn-group'>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='insertUnorderedList' title='" + locale.lists.unordered + "' tabindex='-1'><i class='glyphicon glyphicon-list'></i></a>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='insertOrderedList' title='" + locale.lists.ordered + "' tabindex='-1'><i class='glyphicon glyphicon-th-list'></i></a>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='Outdent' title='" + locale.lists.outdent + "' tabindex='-1'><i class='glyphicon glyphicon-indent-right'></i></a>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='Indent' title='" + locale.lists.indent + "' tabindex='-1'><i class='glyphicon glyphicon-indent-left'></i></a>" +
|
||||
"</div>" +
|
||||
"</li>";
|
||||
},
|
||||
|
||||
"link": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li>" +
|
||||
""+
|
||||
"<div class='bootstrap-wysihtml5-insert-link-modal modal fade'>" +
|
||||
"<div class='modal-dialog'>"+
|
||||
"<div class='modal-content'>"+
|
||||
"<div class='modal-header'>" +
|
||||
"<a class='close' data-dismiss='modal'>×</a>" +
|
||||
"<h4>" + locale.link.insert + "</h4>" +
|
||||
"</div>" +
|
||||
"<div class='modal-body'>" +
|
||||
"<input value='http://' class='bootstrap-wysihtml5-insert-link-url form-control'>" +
|
||||
"<label class='checkbox'> <input type='checkbox' class='bootstrap-wysihtml5-insert-link-target' checked>" + locale.link.target + "</label>" +
|
||||
"</div>" +
|
||||
"<div class='modal-footer'>" +
|
||||
"<button class='btn btn-default' data-dismiss='modal'>" + locale.link.cancel + "</button>" +
|
||||
"<button href='#' class='btn btn-primary' data-dismiss='modal'>" + locale.link.insert + "</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='createLink' title='" + locale.link.insert + "' tabindex='-1'><i class='glyphicon glyphicon-share'></i></a>" +
|
||||
"</li>";
|
||||
},
|
||||
|
||||
"image": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li>" +
|
||||
"<div class='bootstrap-wysihtml5-insert-image-modal modal fade'>" +
|
||||
"<div class='modal-dialog'>"+
|
||||
"<div class='modal-content'>"+
|
||||
"<div class='modal-header'>" +
|
||||
"<a class='close' data-dismiss='modal'>×</a>" +
|
||||
"<h4>" + locale.image.insert + "</h4>" +
|
||||
"</div>" +
|
||||
"<div class='modal-body'>" +
|
||||
"<input value='http://' class='bootstrap-wysihtml5-insert-image-url form-control'>" +
|
||||
"</div>" +
|
||||
"<div class='modal-footer'>" +
|
||||
"<button class='btn btn-default' data-dismiss='modal'>" + locale.image.cancel + "</button>" +
|
||||
"<button class='btn btn-primary' data-dismiss='modal'>" + locale.image.insert + "</button>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"</div>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-command='insertImage' title='" + locale.image.insert + "' tabindex='-1'><i class='glyphicon glyphicon-picture'></i></a>" +
|
||||
"</li>";
|
||||
},
|
||||
|
||||
"html": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li>" +
|
||||
"<div class='btn-group'>" +
|
||||
"<a class='btn btn-" + size + " btn-default' data-wysihtml5-action='change_view' title='" + locale.html.edit + "' tabindex='-1'><i class='glyphicon glyphicon-pencil'></i></a>" +
|
||||
"</div>" +
|
||||
"</li>";
|
||||
},
|
||||
|
||||
"color": function(locale, options) {
|
||||
var size = (options && options.size) ? ' btn-'+options.size : '';
|
||||
return "<li class='dropdown'>" +
|
||||
"<a class='btn dropdown-toggle btn-" + size + " btn-default' data-toggle='dropdown' href='#' tabindex='-1'>" +
|
||||
"<span class='current-color'>" + locale.colours.black + "</span> <b class='caret'></b>" +
|
||||
"</a>" +
|
||||
"<ul class='dropdown-menu'>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='black'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='black'>" + locale.colours.black + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='silver'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='silver'>" + locale.colours.silver + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='gray'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='gray'>" + locale.colours.gray + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='maroon'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='maroon'>" + locale.colours.maroon + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='red'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='red'>" + locale.colours.red + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='purple'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='purple'>" + locale.colours.purple + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='green'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='green'>" + locale.colours.green + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='olive'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='olive'>" + locale.colours.olive + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='navy'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='navy'>" + locale.colours.navy + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='blue'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='blue'>" + locale.colours.blue + "</a></li>" +
|
||||
"<li><div class='wysihtml5-colors' data-wysihtml5-command-value='orange'></div><a class='wysihtml5-colors-title' data-wysihtml5-command='foreColor' data-wysihtml5-command-value='orange'>" + locale.colours.orange + "</a></li>" +
|
||||
"</ul>" +
|
||||
"</li>";
|
||||
}
|
||||
};
|
||||
|
||||
var templates = function(key, locale, options) {
|
||||
return tpl[key](locale, options);
|
||||
};
|
||||
|
||||
|
||||
var Wysihtml5 = function(el, options) {
|
||||
this.el = el;
|
||||
var toolbarOpts = options || defaultOptions;
|
||||
for(var t in toolbarOpts.customTemplates) {
|
||||
tpl[t] = toolbarOpts.customTemplates[t];
|
||||
}
|
||||
this.toolbar = this.createToolbar(el, toolbarOpts);
|
||||
this.editor = this.createEditor(options);
|
||||
|
||||
window.editor = this.editor;
|
||||
|
||||
$('iframe.wysihtml5-sandbox').each(function(i, el){
|
||||
$(el.contentWindow).off('focus.wysihtml5').on({
|
||||
'focus.wysihtml5' : function(){
|
||||
$('li.dropdown').removeClass('open');
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
Wysihtml5.prototype = {
|
||||
|
||||
constructor: Wysihtml5,
|
||||
|
||||
createEditor: function(options) {
|
||||
options = options || {};
|
||||
|
||||
// Add the toolbar to a clone of the options object so multiple instances
|
||||
// of the WYISYWG don't break because "toolbar" is already defined
|
||||
options = $.extend(true, {}, options);
|
||||
options.toolbar = this.toolbar[0];
|
||||
|
||||
var editor = new wysi.Editor(this.el[0], options);
|
||||
|
||||
if(options && options.events) {
|
||||
for(var eventName in options.events) {
|
||||
editor.on(eventName, options.events[eventName]);
|
||||
}
|
||||
}
|
||||
return editor;
|
||||
},
|
||||
|
||||
createToolbar: function(el, options) {
|
||||
var self = this;
|
||||
var toolbar = $("<ul/>", {
|
||||
'class' : "wysihtml5-toolbar",
|
||||
'style': "display:none"
|
||||
});
|
||||
var culture = options.locale || defaultOptions.locale || "en";
|
||||
for(var key in defaultOptions) {
|
||||
var value = false;
|
||||
|
||||
if(options[key] !== undefined) {
|
||||
if(options[key] === true) {
|
||||
value = true;
|
||||
}
|
||||
} else {
|
||||
value = defaultOptions[key];
|
||||
}
|
||||
|
||||
if(value === true) {
|
||||
toolbar.append(templates(key, locale[culture], options));
|
||||
|
||||
if(key === "html") {
|
||||
this.initHtml(toolbar);
|
||||
}
|
||||
|
||||
if(key === "link") {
|
||||
this.initInsertLink(toolbar);
|
||||
}
|
||||
|
||||
if(key === "image") {
|
||||
this.initInsertImage(toolbar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(options.toolbar) {
|
||||
for(key in options.toolbar) {
|
||||
toolbar.append(options.toolbar[key]);
|
||||
}
|
||||
}
|
||||
|
||||
toolbar.find("a[data-wysihtml5-command='formatBlock']").click(function(e) {
|
||||
var target = e.target || e.srcElement;
|
||||
var el = $(target);
|
||||
self.toolbar.find('.current-font').text(el.html());
|
||||
});
|
||||
|
||||
toolbar.find("a[data-wysihtml5-command='foreColor']").click(function(e) {
|
||||
var target = e.target || e.srcElement;
|
||||
var el = $(target);
|
||||
self.toolbar.find('.current-color').text(el.html());
|
||||
});
|
||||
|
||||
this.el.before(toolbar);
|
||||
|
||||
return toolbar;
|
||||
},
|
||||
|
||||
initHtml: function(toolbar) {
|
||||
var changeViewSelector = "a[data-wysihtml5-action='change_view']";
|
||||
toolbar.find(changeViewSelector).click(function(e) {
|
||||
toolbar.find('a.btn').not(changeViewSelector).toggleClass('disabled');
|
||||
});
|
||||
},
|
||||
|
||||
initInsertImage: function(toolbar) {
|
||||
var self = this;
|
||||
var insertImageModal = toolbar.find('.bootstrap-wysihtml5-insert-image-modal');
|
||||
var urlInput = insertImageModal.find('.bootstrap-wysihtml5-insert-image-url');
|
||||
var insertButton = insertImageModal.find('.btn-primary');
|
||||
var initialValue = urlInput.val();
|
||||
var caretBookmark;
|
||||
|
||||
var insertImage = function() {
|
||||
var url = urlInput.val();
|
||||
urlInput.val(initialValue);
|
||||
self.editor.currentView.element.focus();
|
||||
if (caretBookmark) {
|
||||
self.editor.composer.selection.setBookmark(caretBookmark);
|
||||
caretBookmark = null;
|
||||
}
|
||||
self.editor.composer.commands.exec("insertImage", url);
|
||||
};
|
||||
|
||||
urlInput.keypress(function(e) {
|
||||
if(e.which == 13) {
|
||||
insertImage();
|
||||
insertImageModal.modal('hide');
|
||||
}
|
||||
});
|
||||
|
||||
insertButton.click(insertImage);
|
||||
|
||||
insertImageModal.on('shown', function() {
|
||||
urlInput.focus();
|
||||
});
|
||||
|
||||
insertImageModal.on('hide', function() {
|
||||
self.editor.currentView.element.focus();
|
||||
});
|
||||
|
||||
toolbar.find('a[data-wysihtml5-command=insertImage]').click(function() {
|
||||
var activeButton = $(this).hasClass("wysihtml5-command-active");
|
||||
|
||||
if (!activeButton) {
|
||||
self.editor.currentView.element.focus(false);
|
||||
caretBookmark = self.editor.composer.selection.getBookmark();
|
||||
insertImageModal.appendTo('body').modal('show');
|
||||
insertImageModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
initInsertLink: function(toolbar) {
|
||||
var self = this;
|
||||
var insertLinkModal = toolbar.find('.bootstrap-wysihtml5-insert-link-modal');
|
||||
var urlInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-url');
|
||||
var targetInput = insertLinkModal.find('.bootstrap-wysihtml5-insert-link-target');
|
||||
var insertButton = insertLinkModal.find('.btn-primary');
|
||||
var initialValue = urlInput.val();
|
||||
var caretBookmark;
|
||||
|
||||
var insertLink = function() {
|
||||
var url = urlInput.val();
|
||||
urlInput.val(initialValue);
|
||||
self.editor.currentView.element.focus();
|
||||
if (caretBookmark) {
|
||||
self.editor.composer.selection.setBookmark(caretBookmark);
|
||||
caretBookmark = null;
|
||||
}
|
||||
|
||||
var newWindow = targetInput.prop("checked");
|
||||
self.editor.composer.commands.exec("createLink", {
|
||||
'href' : url,
|
||||
'target' : (newWindow ? '_blank' : '_self'),
|
||||
'rel' : (newWindow ? 'nofollow' : '')
|
||||
});
|
||||
};
|
||||
var pressedEnter = false;
|
||||
|
||||
urlInput.keypress(function(e) {
|
||||
if(e.which == 13) {
|
||||
insertLink();
|
||||
insertLinkModal.modal('hide');
|
||||
}
|
||||
});
|
||||
|
||||
insertButton.click(insertLink);
|
||||
|
||||
insertLinkModal.on('shown', function() {
|
||||
urlInput.focus();
|
||||
});
|
||||
|
||||
insertLinkModal.on('hide', function() {
|
||||
self.editor.currentView.element.focus();
|
||||
});
|
||||
|
||||
toolbar.find('a[data-wysihtml5-command=createLink]').click(function() {
|
||||
var activeButton = $(this).hasClass("wysihtml5-command-active");
|
||||
|
||||
if (!activeButton) {
|
||||
self.editor.currentView.element.focus(false);
|
||||
caretBookmark = self.editor.composer.selection.getBookmark();
|
||||
insertLinkModal.appendTo('body').modal('show');
|
||||
insertLinkModal.on('click.dismiss.modal', '[data-dismiss="modal"]', function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// these define our public api
|
||||
var methods = {
|
||||
resetDefaults: function() {
|
||||
$.fn.wysihtml5.defaultOptions = $.extend(true, {}, $.fn.wysihtml5.defaultOptionsCache);
|
||||
},
|
||||
bypassDefaults: function(options) {
|
||||
return this.each(function () {
|
||||
var $this = $(this);
|
||||
$this.data('wysihtml5', new Wysihtml5($this, options));
|
||||
});
|
||||
},
|
||||
shallowExtend: function (options) {
|
||||
var settings = $.extend({}, $.fn.wysihtml5.defaultOptions, options || {}, $(this).data());
|
||||
var that = this;
|
||||
return methods.bypassDefaults.apply(that, [settings]);
|
||||
},
|
||||
deepExtend: function(options) {
|
||||
var settings = $.extend(true, {}, $.fn.wysihtml5.defaultOptions, options || {});
|
||||
var that = this;
|
||||
return methods.bypassDefaults.apply(that, [settings]);
|
||||
},
|
||||
init: function(options) {
|
||||
var that = this;
|
||||
return methods.shallowExtend.apply(that, [options]);
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.wysihtml5 = function ( method ) {
|
||||
if ( methods[method] ) {
|
||||
return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
|
||||
} else if ( typeof method === 'object' || ! method ) {
|
||||
return methods.init.apply( this, arguments );
|
||||
} else {
|
||||
$.error( 'Method ' + method + ' does not exist on jQuery.wysihtml5' );
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.wysihtml5.Constructor = Wysihtml5;
|
||||
|
||||
var defaultOptions = $.fn.wysihtml5.defaultOptions = {
|
||||
"font-styles": true,
|
||||
"color": false,
|
||||
"emphasis": true,
|
||||
"lists": true,
|
||||
"html": false,
|
||||
"link": true,
|
||||
"image": true,
|
||||
"size": 'sm',
|
||||
events: {},
|
||||
parserRules: {
|
||||
classes: {
|
||||
// (path_to_project/lib/css/bootstrap3-wysiwyg5-color.css)
|
||||
"wysiwyg-color-silver" : 1,
|
||||
"wysiwyg-color-gray" : 1,
|
||||
"wysiwyg-color-white" : 1,
|
||||
"wysiwyg-color-maroon" : 1,
|
||||
"wysiwyg-color-red" : 1,
|
||||
"wysiwyg-color-purple" : 1,
|
||||
"wysiwyg-color-fuchsia" : 1,
|
||||
"wysiwyg-color-green" : 1,
|
||||
"wysiwyg-color-lime" : 1,
|
||||
"wysiwyg-color-olive" : 1,
|
||||
"wysiwyg-color-yellow" : 1,
|
||||
"wysiwyg-color-navy" : 1,
|
||||
"wysiwyg-color-blue" : 1,
|
||||
"wysiwyg-color-teal" : 1,
|
||||
"wysiwyg-color-aqua" : 1,
|
||||
"wysiwyg-color-orange" : 1
|
||||
},
|
||||
tags: {
|
||||
"b": {},
|
||||
"i": {},
|
||||
"br": {},
|
||||
"ol": {},
|
||||
"ul": {},
|
||||
"li": {},
|
||||
"h1": {},
|
||||
"h2": {},
|
||||
"h3": {},
|
||||
"h4": {},
|
||||
"h5": {},
|
||||
"h6": {},
|
||||
"blockquote": {},
|
||||
"u": 1,
|
||||
"img": {
|
||||
"check_attributes": {
|
||||
"width": "numbers",
|
||||
"alt": "alt",
|
||||
"src": "url",
|
||||
"height": "numbers"
|
||||
}
|
||||
},
|
||||
"a": {
|
||||
check_attributes: {
|
||||
'href': "url", // important to avoid XSS
|
||||
'target': 'alt',
|
||||
'rel': 'alt'
|
||||
}
|
||||
},
|
||||
"span": 1,
|
||||
"div": 1,
|
||||
// to allow save and edit files with code tag hacks
|
||||
"code": 1,
|
||||
"pre": 1
|
||||
}
|
||||
},
|
||||
stylesheets: ["./css/bootstrap3-wysiwyg5-color.css"], // (path_to_project/lib/css/bootstrap3-wysiwyg5-color.css)
|
||||
locale: "en"
|
||||
};
|
||||
|
||||
if (typeof $.fn.wysihtml5.defaultOptionsCache === 'undefined') {
|
||||
$.fn.wysihtml5.defaultOptionsCache = $.extend(true, {}, $.fn.wysihtml5.defaultOptions);
|
||||
}
|
||||
|
||||
var locale = $.fn.wysihtml5.locale = {
|
||||
en: {
|
||||
font_styles: {
|
||||
normal: "Normal text",
|
||||
h1: "Heading 1",
|
||||
h2: "Heading 2",
|
||||
h3: "Heading 3",
|
||||
h4: "Heading 4",
|
||||
h5: "Heading 5",
|
||||
h6: "Heading 6"
|
||||
},
|
||||
emphasis: {
|
||||
bold: "Bold",
|
||||
italic: "Italic",
|
||||
underline: "Underline"
|
||||
},
|
||||
lists: {
|
||||
unordered: "Unordered list",
|
||||
ordered: "Ordered list",
|
||||
outdent: "Outdent",
|
||||
indent: "Indent"
|
||||
},
|
||||
link: {
|
||||
insert: "Insert link",
|
||||
cancel: "Cancel",
|
||||
target: "Open link in new window"
|
||||
},
|
||||
image: {
|
||||
insert: "Insert image",
|
||||
cancel: "Cancel"
|
||||
},
|
||||
html: {
|
||||
edit: "Edit HTML"
|
||||
},
|
||||
colours: {
|
||||
black: "Black",
|
||||
silver: "Silver",
|
||||
gray: "Grey",
|
||||
maroon: "Maroon",
|
||||
red: "Red",
|
||||
purple: "Purple",
|
||||
green: "Green",
|
||||
olive: "Olive",
|
||||
navy: "Navy",
|
||||
blue: "Blue",
|
||||
orange: "Orange"
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
}(window.jQuery, window.wysihtml5);
|
315
js/ekko-lightbox-modified.js
Normal file
@ -0,0 +1,315 @@
|
||||
// Generated by CoffeeScript 1.6.3
|
||||
/*
|
||||
Lightbox for Bootstrap 3 by @ashleydw
|
||||
https://github.com/ashleydw/lightbox
|
||||
|
||||
License: https://github.com/ashleydw/lightbox/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
|
||||
(function () {
|
||||
"use strict";
|
||||
var EkkoLightbox;
|
||||
|
||||
EkkoLightbox = function (element, options) {
|
||||
var content, footer, header, video_id,
|
||||
_this = this;
|
||||
this.options = $.extend({
|
||||
gallery_parent_selector: '*:not(.row)',
|
||||
title: null,
|
||||
footer: null,
|
||||
remote: null,
|
||||
left_arrow_class: '.glyphicon .glyphicon-chevron-left',
|
||||
right_arrow_class: '.glyphicon .glyphicon-chevron-right',
|
||||
directional_arrows: true,
|
||||
type: null,
|
||||
onShow: function () {
|
||||
},
|
||||
onShown: function () {
|
||||
},
|
||||
onHide: function () {
|
||||
},
|
||||
onHidden: function () {
|
||||
},
|
||||
id: false
|
||||
}, options || {});
|
||||
this.$element = $(element);
|
||||
content = '';
|
||||
this.modal_id = this.options.modal_id ? this.options.modal_id : 'ekkoLightbox-' + Math.floor((Math.random() * 1000) + 1);
|
||||
header = '<div class="modal-header"' + (this.options.title ? '' : ' style="display:none"') + '><button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button><h4 class="modal-title">' + this.options.title + '</h4></div>';
|
||||
footer = '<div class="modal-footer"' + (this.options.footer ? '' : ' style="display:none"') + '>' + this.options.footer + '</div>';
|
||||
//footer = '<div class="modal-footer"><button type="button" class="btn btn-primary" data-dismiss="modal">Close</button></div>';
|
||||
$(document.body).append('<div id="' + this.modal_id + '" class="ekko-lightbox modal" tabindex="-1"><div class="modal-dialog" style="margin-top: 0 !important"><div class="modal-content">' + header + '<div class="modal-body"><div class="ekko-lightbox-container"><div></div></div></div>' + footer + '</div></div></div>');
|
||||
this.modal = $('#' + this.modal_id);
|
||||
this.modal_body = this.modal.find('.modal-body').first();
|
||||
this.lightbox_container = this.modal_body.find('.ekko-lightbox-container').first();
|
||||
this.lightbox_body = this.lightbox_container.find('> div:first-child').first();
|
||||
this.modal_arrows = null;
|
||||
this.padding = {
|
||||
left: parseFloat(this.modal_body.css('padding-left'), 10),
|
||||
right: parseFloat(this.modal_body.css('padding-right'), 10),
|
||||
bottom: parseFloat(this.modal_body.css('padding-bottom'), 10),
|
||||
top: parseFloat(this.modal_body.css('padding-top'), 10)
|
||||
};
|
||||
if (!this.options.remote) {
|
||||
this.error('No remote target given');
|
||||
} else {
|
||||
this.gallery = this.$element.data('gallery');
|
||||
if (this.gallery) {
|
||||
if (this.options.gallery_parent_selector === 'document.body' || this.options.gallery_parent_selector === '') {
|
||||
this.gallery_items = $(document.body).find('*[data-toggle="lightbox"][data-gallery="' + this.gallery + '"]');
|
||||
} else {
|
||||
this.gallery_items = this.$element.parents(this.options.gallery_parent_selector).first().find('*[data-toggle="lightbox"][data-gallery="' + this.gallery + '"]');
|
||||
}
|
||||
this.gallery_index = this.gallery_items.index(this.$element);
|
||||
$(document).on('keydown.ekkoLightbox', this.navigate.bind(this));
|
||||
if (this.options.directional_arrows) {
|
||||
this.lightbox_container.prepend('<div class="ekko-lightbox-nav-overlay"><a href="#" class="' + this.strip_stops(this.options.left_arrow_class) + '"></a><a href="#" class="' + this.strip_stops(this.options.right_arrow_class) + '"></a></div>');
|
||||
this.modal_arrows = this.lightbox_container.find('div.ekko-lightbox-nav-overlay').first();
|
||||
this.lightbox_container.find('a' + this.strip_spaces(this.options.left_arrow_class)).on('click', function (event) {
|
||||
event.preventDefault();
|
||||
return _this.navigate_left();
|
||||
});
|
||||
this.lightbox_container.find('a' + this.strip_spaces(this.options.right_arrow_class)).on('click', function (event) {
|
||||
event.preventDefault();
|
||||
return _this.navigate_right();
|
||||
});
|
||||
}
|
||||
}
|
||||
if (this.options.type) {
|
||||
if (this.options.type === 'image') {
|
||||
this.preloadImage(this.options.remote, true);
|
||||
} else if (this.options.type === 'youtube' && (video_id = this.getYoutubeId(this.options.remote))) {
|
||||
this.showYoutubeVideo(video_id);
|
||||
} else if (this.options.type === 'vimeo') {
|
||||
this.showVimeoVideo(this.options.remote);
|
||||
} else {
|
||||
this.error("Could not detect remote target type. Force the type using data-type=\"image|youtube|vimeo\"");
|
||||
}
|
||||
} else {
|
||||
this.detectRemoteType(this.options.remote);
|
||||
}
|
||||
}
|
||||
this.modal.on('show.bs.modal', this.options.onShow.bind(this)).on('shown.bs.modal',function () {
|
||||
if (_this.modal_arrows) {
|
||||
_this.resize(_this.lightbox_body.width());
|
||||
}
|
||||
return _this.options.onShown.call(_this);
|
||||
}).on('hide.bs.modal', this.options.onHide.bind(this)).on('hidden.bs.modal',function () {
|
||||
if (_this.gallery) {
|
||||
$(document).off('keydown.ekkoLightbox');
|
||||
}
|
||||
_this.modal.remove();
|
||||
return _this.options.onHidden.call(_this);
|
||||
}).modal('show', options);
|
||||
return this.modal;
|
||||
};
|
||||
|
||||
EkkoLightbox.prototype = {
|
||||
strip_stops: function (str) {
|
||||
return str.replace(/\./g, '');
|
||||
},
|
||||
strip_spaces: function (str) {
|
||||
return str.replace(/\s/g, '');
|
||||
},
|
||||
isImage: function (str) {
|
||||
return str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i);
|
||||
},
|
||||
isSwf: function (str) {
|
||||
return str.match(/\.(swf)((\?|#).*)?$/i);
|
||||
},
|
||||
getYoutubeId: function (str) {
|
||||
var match;
|
||||
match = str.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
|
||||
if (match && match[2].length === 11) {
|
||||
return match[2];
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
getVimeoId: function (str) {
|
||||
if (str.indexOf('vimeo') > 0) {
|
||||
return str;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
navigate: function (event) {
|
||||
event = event || window.event;
|
||||
if (event.keyCode === 39 || event.keyCode === 37) {
|
||||
if (event.keyCode === 39) {
|
||||
return this.navigate_right();
|
||||
} else if (event.keyCode === 37) {
|
||||
return this.navigate_left();
|
||||
}
|
||||
}
|
||||
},
|
||||
navigate_left: function () {
|
||||
var src;
|
||||
if (this.gallery_index === 0) {
|
||||
this.gallery_index = this.gallery_items.length - 1;
|
||||
} else {
|
||||
this.gallery_index--;
|
||||
}
|
||||
this.$element = $(this.gallery_items.get(this.gallery_index));
|
||||
this.updateTitleAndFooter();
|
||||
src = this.$element.attr('data-remote') || this.$element.attr('href');
|
||||
return this.detectRemoteType(src);
|
||||
},
|
||||
navigate_right: function () {
|
||||
var next, src;
|
||||
if (this.gallery_index === this.gallery_items.length - 1) {
|
||||
this.gallery_index = 0;
|
||||
} else {
|
||||
this.gallery_index++;
|
||||
}
|
||||
this.$element = $(this.gallery_items.get(this.gallery_index));
|
||||
src = this.$element.attr('data-remote') || this.$element.attr('href');
|
||||
this.updateTitleAndFooter();
|
||||
this.detectRemoteType(src);
|
||||
if (this.gallery_index + 1 < this.gallery_items.length) {
|
||||
next = $(this.gallery_items.get(this.gallery_index + 1), false);
|
||||
src = next.attr('data-remote') || next.attr('href');
|
||||
if (this.isImage(src)) {
|
||||
return this.preloadImage(src, false);
|
||||
}
|
||||
}
|
||||
},
|
||||
detectRemoteType: function (src) {
|
||||
var video_id;
|
||||
if (this.isImage(src)) {
|
||||
return this.preloadImage(src, true);
|
||||
} else if (video_id = this.getYoutubeId(src)) {
|
||||
return this.showYoutubeVideo(video_id);
|
||||
} else if (video_id = this.getVimeoId(src)) {
|
||||
return this.showVimeoVideo(video_id);
|
||||
} else {
|
||||
return this.error("Could not detect remote target type. Force the type using data-type=\"image|youtube|vimeo\"");
|
||||
}
|
||||
},
|
||||
updateTitleAndFooter: function () {
|
||||
var caption, footer, header, title;
|
||||
header = this.modal.find('.modal-dialog .modal-content .modal-header');
|
||||
footer = this.modal.find('.modal-dialog .modal-content .modal-footer');
|
||||
title = this.$element.data('title') || "";
|
||||
caption = this.$element.data('footer') || "";
|
||||
if (title) {
|
||||
header.css('display', '').find('.modal-title').html(title);
|
||||
} else {
|
||||
header.css('display', 'none');
|
||||
}
|
||||
if (caption) {
|
||||
footer.css('display', '').html(caption);
|
||||
} else {
|
||||
footer.css('display', 'none');
|
||||
}
|
||||
return this;
|
||||
},
|
||||
showLoading: function () {
|
||||
this.lightbox_body.html('<div class="modal-loading"><div class="loader"></div></div>');
|
||||
return this;
|
||||
},
|
||||
showYoutubeVideo: function (id) {
|
||||
this.resize(560);
|
||||
this.lightbox_body.html('<iframe width="560" height="315" src="//www.youtube.com/embed/' + id + '?badge=0&autoplay=1" frameborder="0" allowfullscreen></iframe>');
|
||||
if (this.modal_arrows) {
|
||||
return this.modal_arrows.css('display', 'none');
|
||||
}
|
||||
},
|
||||
showVimeoVideo: function (id) {
|
||||
this.resize(500);
|
||||
this.lightbox_body.html('<iframe width="500" height="281" src="' + id + '?autoplay=1" frameborder="0" allowfullscreen></iframe>');
|
||||
if (this.modal_arrows) {
|
||||
return this.modal_arrows.css('display', 'none');
|
||||
}
|
||||
},
|
||||
error: function (message) {
|
||||
this.lightbox_body.html(message);
|
||||
return this;
|
||||
},
|
||||
preloadImage: function (src, onLoadShowImage) {
|
||||
|
||||
var img,
|
||||
_this = this;
|
||||
|
||||
_this.showLoading();
|
||||
|
||||
img = new Image();
|
||||
if ((onLoadShowImage == null) || onLoadShowImage === true) {
|
||||
img.onload = function () {
|
||||
var image, width;
|
||||
width = _this.checkImageDimensions(img.width);
|
||||
image = $('<img />');
|
||||
image.attr('src', img.src);
|
||||
image.css('max-width', '100%');
|
||||
_this.lightbox_body.html(image);
|
||||
if (_this.modal_arrows) {
|
||||
_this.modal_arrows.css('display', 'block');
|
||||
}
|
||||
return _this.resize(width);
|
||||
};
|
||||
img.onerror = function () {
|
||||
return _this.error('Failed to load image: ' + src);
|
||||
};
|
||||
}
|
||||
img.src = src;
|
||||
return img;
|
||||
},
|
||||
resize: function (width) {
|
||||
var width_inc_padding;
|
||||
width_inc_padding = width + this.padding.left + this.padding.right;
|
||||
//this.modal.find('.modal-content').css('width', width_inc_padding);
|
||||
//this.modal.find('.modal-dialog').css('width', width_inc_padding + 20);
|
||||
this.modal.find('.modal-content').animate({width: width_inc_padding}, 200);
|
||||
this.modal.find('.modal-dialog').animate({width: width_inc_padding + 20}, 200);
|
||||
this.lightbox_container.find('a').css('padding-top', function () {
|
||||
return $(this).parent().height() / 2;
|
||||
});
|
||||
return this;
|
||||
},
|
||||
checkImageDimensions: function (max_width) {
|
||||
var w, width;
|
||||
w = $(window);
|
||||
width = max_width;
|
||||
if ((max_width + (this.padding.left + this.padding.right + 20)) > w.width()) {
|
||||
width = w.width() - (this.padding.left + this.padding.right + 20);
|
||||
}
|
||||
return width - 20;
|
||||
},
|
||||
close: function () {
|
||||
return this.modal.modal('hide');
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.ekkoLightbox = function (options) {
|
||||
return this.each(function () {
|
||||
var $this;
|
||||
$this = $(this);
|
||||
options = $.extend({
|
||||
remote: $this.attr('data-remote') || $this.attr('href'),
|
||||
gallery_parent_selector: $this.attr('data-parent'),
|
||||
type: $this.attr('data-type')
|
||||
}, options, $this.data());
|
||||
new EkkoLightbox(this, options);
|
||||
return this;
|
||||
});
|
||||
};
|
||||
|
||||
$(document).delegate('*[data-toggle="lightbox"]', 'click', function (event) {
|
||||
var $this;
|
||||
event.preventDefault();
|
||||
$this = $(this);
|
||||
return $this.ekkoLightbox({
|
||||
remote: $this.attr('data-remote') || $this.attr('href'),
|
||||
gallery_parent_selector: $this.attr('data-parent'),
|
||||
onShown: function () {
|
||||
if (window.console) {
|
||||
return console.log('Checking our the events huh?');
|
||||
}
|
||||
}
|
||||
}).one('hide', function () {
|
||||
return $this.is(':visible') && $this.focus();
|
||||
});
|
||||
});
|
||||
|
||||
}).call(this);
|
301
js/html5shiv.js
vendored
Normal file
@ -0,0 +1,301 @@
|
||||
/**
|
||||
* @preserve HTML5 Shiv prev3.7.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
|
||||
*/
|
||||
;(function(window, document) {
|
||||
/*jshint evil:true */
|
||||
/** version */
|
||||
var version = '3.7.0';
|
||||
|
||||
/** Preset options */
|
||||
var options = window.html5 || {};
|
||||
|
||||
/** Used to skip problem elements */
|
||||
var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
|
||||
|
||||
/** Not all elements can be cloned in IE **/
|
||||
var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
|
||||
|
||||
/** Detect whether the browser supports default html5 styles */
|
||||
var supportsHtml5Styles;
|
||||
|
||||
/** Name of the expando, to work with multiple documents or to re-shiv one document */
|
||||
var expando = '_html5shiv';
|
||||
|
||||
/** The id for the the documents expando */
|
||||
var expanID = 0;
|
||||
|
||||
/** Cached data for each document */
|
||||
var expandoData = {};
|
||||
|
||||
/** Detect whether the browser supports unknown elements */
|
||||
var supportsUnknownElements;
|
||||
|
||||
(function() {
|
||||
try {
|
||||
var a = document.createElement('a');
|
||||
a.innerHTML = '<xyz></xyz>';
|
||||
//if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
|
||||
supportsHtml5Styles = ('hidden' in a);
|
||||
|
||||
supportsUnknownElements = a.childNodes.length == 1 || (function() {
|
||||
// assign a false positive if unable to shiv
|
||||
(document.createElement)('a');
|
||||
var frag = document.createDocumentFragment();
|
||||
return (
|
||||
typeof frag.cloneNode == 'undefined' ||
|
||||
typeof frag.createDocumentFragment == 'undefined' ||
|
||||
typeof frag.createElement == 'undefined'
|
||||
);
|
||||
}());
|
||||
} catch(e) {
|
||||
// assign a false positive if detection fails => unable to shiv
|
||||
supportsHtml5Styles = true;
|
||||
supportsUnknownElements = true;
|
||||
}
|
||||
|
||||
}());
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Creates a style sheet with the given CSS text and adds it to the document.
|
||||
* @private
|
||||
* @param {Document} ownerDocument The document.
|
||||
* @param {String} cssText The CSS text.
|
||||
* @returns {StyleSheet} The style element.
|
||||
*/
|
||||
function addStyleSheet(ownerDocument, cssText) {
|
||||
var p = ownerDocument.createElement('p'),
|
||||
parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
|
||||
|
||||
p.innerHTML = 'x<style>' + cssText + '</style>';
|
||||
return parent.insertBefore(p.lastChild, parent.firstChild);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value of `html5.elements` as an array.
|
||||
* @private
|
||||
* @returns {Array} An array of shived element node names.
|
||||
*/
|
||||
function getElements() {
|
||||
var elements = html5.elements;
|
||||
return typeof elements == 'string' ? elements.split(' ') : elements;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the data associated to the given document
|
||||
* @private
|
||||
* @param {Document} ownerDocument The document.
|
||||
* @returns {Object} An object of data.
|
||||
*/
|
||||
function getExpandoData(ownerDocument) {
|
||||
var data = expandoData[ownerDocument[expando]];
|
||||
if (!data) {
|
||||
data = {};
|
||||
expanID++;
|
||||
ownerDocument[expando] = expanID;
|
||||
expandoData[expanID] = data;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a shived element for the given nodeName and document
|
||||
* @memberOf html5
|
||||
* @param {String} nodeName name of the element
|
||||
* @param {Document} ownerDocument The context document.
|
||||
* @returns {Object} The shived element.
|
||||
*/
|
||||
function createElement(nodeName, ownerDocument, data){
|
||||
if (!ownerDocument) {
|
||||
ownerDocument = document;
|
||||
}
|
||||
if(supportsUnknownElements){
|
||||
return ownerDocument.createElement(nodeName);
|
||||
}
|
||||
if (!data) {
|
||||
data = getExpandoData(ownerDocument);
|
||||
}
|
||||
var node;
|
||||
|
||||
if (data.cache[nodeName]) {
|
||||
node = data.cache[nodeName].cloneNode();
|
||||
} else if (saveClones.test(nodeName)) {
|
||||
node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
|
||||
} else {
|
||||
node = data.createElem(nodeName);
|
||||
}
|
||||
|
||||
// Avoid adding some elements to fragments in IE < 9 because
|
||||
// * Attributes like `name` or `type` cannot be set/changed once an element
|
||||
// is inserted into a document/fragment
|
||||
// * Link elements with `src` attributes that are inaccessible, as with
|
||||
// a 403 response, will cause the tab/window to crash
|
||||
// * Script elements appended to fragments will execute when their `src`
|
||||
// or `text` property is set
|
||||
return node.canHaveChildren && !reSkip.test(nodeName) && !node.tagUrn ? data.frag.appendChild(node) : node;
|
||||
}
|
||||
|
||||
/**
|
||||
* returns a shived DocumentFragment for the given document
|
||||
* @memberOf html5
|
||||
* @param {Document} ownerDocument The context document.
|
||||
* @returns {Object} The shived DocumentFragment.
|
||||
*/
|
||||
function createDocumentFragment(ownerDocument, data){
|
||||
if (!ownerDocument) {
|
||||
ownerDocument = document;
|
||||
}
|
||||
if(supportsUnknownElements){
|
||||
return ownerDocument.createDocumentFragment();
|
||||
}
|
||||
data = data || getExpandoData(ownerDocument);
|
||||
var clone = data.frag.cloneNode(),
|
||||
i = 0,
|
||||
elems = getElements(),
|
||||
l = elems.length;
|
||||
for(;i<l;i++){
|
||||
clone.createElement(elems[i]);
|
||||
}
|
||||
return clone;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shivs the `createElement` and `createDocumentFragment` methods of the document.
|
||||
* @private
|
||||
* @param {Document|DocumentFragment} ownerDocument The document.
|
||||
* @param {Object} data of the document.
|
||||
*/
|
||||
function shivMethods(ownerDocument, data) {
|
||||
if (!data.cache) {
|
||||
data.cache = {};
|
||||
data.createElem = ownerDocument.createElement;
|
||||
data.createFrag = ownerDocument.createDocumentFragment;
|
||||
data.frag = data.createFrag();
|
||||
}
|
||||
|
||||
|
||||
ownerDocument.createElement = function(nodeName) {
|
||||
//abort shiv
|
||||
if (!html5.shivMethods) {
|
||||
return data.createElem(nodeName);
|
||||
}
|
||||
return createElement(nodeName, ownerDocument, data);
|
||||
};
|
||||
|
||||
ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
|
||||
'var n=f.cloneNode(),c=n.createElement;' +
|
||||
'h.shivMethods&&(' +
|
||||
// unroll the `createElement` calls
|
||||
getElements().join().replace(/[\w\-]+/g, function(nodeName) {
|
||||
data.createElem(nodeName);
|
||||
data.frag.createElement(nodeName);
|
||||
return 'c("' + nodeName + '")';
|
||||
}) +
|
||||
');return n}'
|
||||
)(html5, data.frag);
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* Shivs the given document.
|
||||
* @memberOf html5
|
||||
* @param {Document} ownerDocument The document to shiv.
|
||||
* @returns {Document} The shived document.
|
||||
*/
|
||||
function shivDocument(ownerDocument) {
|
||||
if (!ownerDocument) {
|
||||
ownerDocument = document;
|
||||
}
|
||||
var data = getExpandoData(ownerDocument);
|
||||
|
||||
if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
|
||||
data.hasCSS = !!addStyleSheet(ownerDocument,
|
||||
// corrects block display not defined in IE6/7/8/9
|
||||
'article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}' +
|
||||
// adds styling not present in IE6/7/8/9
|
||||
'mark{background:#FF0;color:#000}' +
|
||||
// hides non-rendered elements
|
||||
'template{display:none}'
|
||||
);
|
||||
}
|
||||
if (!supportsUnknownElements) {
|
||||
shivMethods(ownerDocument, data);
|
||||
}
|
||||
return ownerDocument;
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* The `html5` object is exposed so that more elements can be shived and
|
||||
* existing shiving can be detected on iframes.
|
||||
* @type Object
|
||||
* @example
|
||||
*
|
||||
* // options can be changed before the script is included
|
||||
* html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
|
||||
*/
|
||||
var html5 = {
|
||||
|
||||
/**
|
||||
* An array or space separated string of node names of the elements to shiv.
|
||||
* @memberOf html5
|
||||
* @type Array|String
|
||||
*/
|
||||
'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video',
|
||||
|
||||
/**
|
||||
* current version of html5shiv
|
||||
*/
|
||||
'version': version,
|
||||
|
||||
/**
|
||||
* A flag to indicate that the HTML5 style sheet should be inserted.
|
||||
* @memberOf html5
|
||||
* @type Boolean
|
||||
*/
|
||||
'shivCSS': (options.shivCSS !== false),
|
||||
|
||||
/**
|
||||
* Is equal to true if a browser supports creating unknown/HTML5 elements
|
||||
* @memberOf html5
|
||||
* @type boolean
|
||||
*/
|
||||
'supportsUnknownElements': supportsUnknownElements,
|
||||
|
||||
/**
|
||||
* A flag to indicate that the document's `createElement` and `createDocumentFragment`
|
||||
* methods should be overwritten.
|
||||
* @memberOf html5
|
||||
* @type Boolean
|
||||
*/
|
||||
'shivMethods': (options.shivMethods !== false),
|
||||
|
||||
/**
|
||||
* A string to describe the type of `html5` object ("default" or "default print").
|
||||
* @memberOf html5
|
||||
* @type String
|
||||
*/
|
||||
'type': 'default',
|
||||
|
||||
// shivs the document according to the specified `html5` object options
|
||||
'shivDocument': shivDocument,
|
||||
|
||||
//creates a shived element
|
||||
createElement: createElement,
|
||||
|
||||
//creates a shived documentFragment
|
||||
createDocumentFragment: createDocumentFragment
|
||||
};
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
// expose html5
|
||||
window.html5 = html5;
|
||||
|
||||
// shiv the document
|
||||
shivDocument(document);
|
||||
|
||||
}(this, document));
|
7
js/jquery.autosize.min.js
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
/*!
|
||||
Autosize v1.17.8 - 2013-09-07
|
||||
Automatically adjust textarea height based on user input.
|
||||
(c) 2013 Jack Moore - http://www.jacklmoore.com/autosize
|
||||
license: http://www.opensource.org/licenses/mit-license.php
|
||||
*/
|
||||
(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(window.jQuery||window.$)})(function(e){var t,o={className:"autosizejs",append:"",callback:!1,resizeDelay:10},i='<textarea tabindex="-1" style="position:absolute; top:-999px; left:0; right:auto; bottom:auto; border:0; padding: 0; -moz-box-sizing:content-box; -webkit-box-sizing:content-box; box-sizing:content-box; word-wrap:break-word; height:0 !important; min-height:0 !important; overflow:hidden; transition:none; -webkit-transition:none; -moz-transition:none;"/>',n=["fontFamily","fontSize","fontWeight","fontStyle","letterSpacing","textTransform","wordSpacing","textIndent"],s=e(i).data("autosize",!0)[0];s.style.lineHeight="99px","99px"===e(s).css("lineHeight")&&n.push("lineHeight"),s.style.lineHeight="",e.fn.autosize=function(i){return this.length?(i=e.extend({},o,i||{}),s.parentNode!==document.body&&e(document.body).append(s),this.each(function(){function o(){var t,o;"getComputedStyle"in window?(t=window.getComputedStyle(u),o=u.getBoundingClientRect().width,e.each(["paddingLeft","paddingRight","borderLeftWidth","borderRightWidth"],function(e,i){o-=parseInt(t[i],10)}),s.style.width=o+"px"):s.style.width=Math.max(p.width(),0)+"px"}function a(){var a={};if(t=u,s.className=i.className,d=parseInt(p.css("maxHeight"),10),e.each(n,function(e,t){a[t]=p.css(t)}),e(s).css(a),o(),window.chrome){var r=u.style.width;u.style.width="0px",u.offsetWidth,u.style.width=r}}function r(){var e,n;t!==u?a():o(),s.value=u.value+i.append,s.style.overflowY=u.style.overflowY,n=parseInt(u.style.height,10),s.scrollTop=0,s.scrollTop=9e4,e=s.scrollTop,d&&e>d?(u.style.overflowY="scroll",e=d):(u.style.overflowY="hidden",c>e&&(e=c)),e+=f,n!==e&&(u.style.height=e+"px",w&&i.callback.call(u,u))}function l(){clearTimeout(h),h=setTimeout(function(){var e=p.width();e!==g&&(g=e,r())},parseInt(i.resizeDelay,10))}var d,c,h,u=this,p=e(u),f=0,w=e.isFunction(i.callback),z={height:u.style.height,overflow:u.style.overflow,overflowY:u.style.overflowY,wordWrap:u.style.wordWrap,resize:u.style.resize},g=p.width();p.data("autosize")||(p.data("autosize",!0),("border-box"===p.css("box-sizing")||"border-box"===p.css("-moz-box-sizing")||"border-box"===p.css("-webkit-box-sizing"))&&(f=p.outerHeight()-p.height()),c=Math.max(parseInt(p.css("minHeight"),10)-f||0,p.height()),p.css({overflow:"hidden",overflowY:"hidden",wordWrap:"break-word",resize:"none"===p.css("resize")||"vertical"===p.css("resize")?"none":"horizontal"}),"onpropertychange"in u?"oninput"in u?p.on("input.autosize keyup.autosize",r):p.on("propertychange.autosize",function(){"value"===event.propertyName&&r()}):p.on("input.autosize",r),i.resizeDelay!==!1&&e(window).on("resize.autosize",l),p.on("autosize.resize",r),p.on("autosize.resizeIncludeStyle",function(){t=null,r()}),p.on("autosize.destroy",function(){t=null,clearTimeout(h),e(window).off("resize",l),p.off("autosize").off(".autosize").css(z).removeData("autosize")}),r())})):this}});
|
113
js/jquery.cookie.js
Normal file
@ -0,0 +1,113 @@
|
||||
/*!
|
||||
* jQuery Cookie Plugin v1.4.0
|
||||
* https://github.com/carhartl/jquery-cookie
|
||||
*
|
||||
* Copyright 2013 Klaus Hartl
|
||||
* Released under the MIT license
|
||||
*/
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals.
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
|
||||
var pluses = /\+/g;
|
||||
|
||||
function encode(s) {
|
||||
return config.raw ? s : encodeURIComponent(s);
|
||||
}
|
||||
|
||||
function decode(s) {
|
||||
return config.raw ? s : decodeURIComponent(s);
|
||||
}
|
||||
|
||||
function stringifyCookieValue(value) {
|
||||
return encode(config.json ? JSON.stringify(value) : String(value));
|
||||
}
|
||||
|
||||
function parseCookieValue(s) {
|
||||
if (s.indexOf('"') === 0) {
|
||||
// This is a quoted cookie as according to RFC2068, unescape...
|
||||
s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
||||
}
|
||||
|
||||
try {
|
||||
// Replace server-side written pluses with spaces.
|
||||
// If we can't decode the cookie, ignore it, it's unusable.
|
||||
// If we can't parse the cookie, ignore it, it's unusable.
|
||||
s = decodeURIComponent(s.replace(pluses, ' '));
|
||||
return config.json ? JSON.parse(s) : s;
|
||||
} catch(e) {}
|
||||
}
|
||||
|
||||
function read(s, converter) {
|
||||
var value = config.raw ? s : parseCookieValue(s);
|
||||
return $.isFunction(converter) ? converter(value) : value;
|
||||
}
|
||||
|
||||
var config = $.cookie = function (key, value, options) {
|
||||
|
||||
// Write
|
||||
if (value !== undefined && !$.isFunction(value)) {
|
||||
options = $.extend({}, config.defaults, options);
|
||||
|
||||
if (typeof options.expires === 'number') {
|
||||
var days = options.expires, t = options.expires = new Date();
|
||||
t.setDate(t.getDate() + days);
|
||||
}
|
||||
|
||||
return (document.cookie = [
|
||||
encode(key), '=', stringifyCookieValue(value),
|
||||
options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
|
||||
options.path ? '; path=' + options.path : '',
|
||||
options.domain ? '; domain=' + options.domain : '',
|
||||
options.secure ? '; secure' : ''
|
||||
].join(''));
|
||||
}
|
||||
|
||||
// Read
|
||||
|
||||
var result = key ? undefined : {};
|
||||
|
||||
// To prevent the for loop in the first place assign an empty array
|
||||
// in case there are no cookies at all. Also prevents odd result when
|
||||
// calling $.cookie().
|
||||
var cookies = document.cookie ? document.cookie.split('; ') : [];
|
||||
|
||||
for (var i = 0, l = cookies.length; i < l; i++) {
|
||||
var parts = cookies[i].split('=');
|
||||
var name = decode(parts.shift());
|
||||
var cookie = parts.join('=');
|
||||
|
||||
if (key && key === name) {
|
||||
// If second argument (value) is a function it's a converter...
|
||||
result = read(cookie, value);
|
||||
break;
|
||||
}
|
||||
|
||||
// Prevent storing a cookie that we couldn't decode.
|
||||
if (!key && (cookie = read(cookie)) !== undefined) {
|
||||
result[name] = cookie;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
config.defaults = {};
|
||||
|
||||
$.removeCookie = function (key, options) {
|
||||
if ($.cookie(key) === undefined) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Must not alter options, thus extending a fresh object...
|
||||
$.cookie(key, '', $.extend({}, options, { expires: -1 }));
|
||||
return !$.cookie(key);
|
||||
};
|
||||
|
||||
}));
|
17
js/jquery.highlight.min.js
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
/*
|
||||
|
||||
highlight v4
|
||||
|
||||
Highlights arbitrary terms.
|
||||
|
||||
<http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html>
|
||||
|
||||
MIT license.
|
||||
|
||||
Johann Burkard
|
||||
<http://johannburkard.de>
|
||||
<mailto:jb@eaio.com>
|
||||
|
||||
*/
|
||||
|
||||
jQuery.fn.highlight=function(c){function e(b,c){var d=0;if(3==b.nodeType){var a=b.data.toUpperCase().indexOf(c);if(0<=a){d=document.createElement("span");d.className="highlight";a=b.splitText(a);a.splitText(c.length);var f=a.cloneNode(!0);d.appendChild(f);a.parentNode.replaceChild(d,a);d=1}}else if(1==b.nodeType&&b.childNodes&&!/(script|style)/i.test(b.tagName))for(a=0;a<b.childNodes.length;++a)a+=e(b.childNodes[a],c);return d}return this.length&&c&&c.length?this.each(function(){e(this,c.toUpperCase())}): this};jQuery.fn.removeHighlight=function(){return this.find("span.highlight").each(function(){this.parentNode.firstChild.nodeName;with(this.parentNode)replaceChild(this.firstChild,this),normalize()}).end()};
|
1
js/jquery.knob.min.js
vendored
Normal file
193
js/jquery.timeago.js
Normal file
@ -0,0 +1,193 @@
|
||||
/**
|
||||
* Timeago is a jQuery plugin that makes it easy to support automatically
|
||||
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
|
||||
*
|
||||
* @name timeago
|
||||
* @version 1.3.0
|
||||
* @requires jQuery v1.2.3+
|
||||
* @author Ryan McGeary
|
||||
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* For usage and examples, visit:
|
||||
* http://timeago.yarp.com/
|
||||
*
|
||||
* Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
|
||||
*/
|
||||
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
$.timeago = function(timestamp) {
|
||||
if (timestamp instanceof Date) {
|
||||
return inWords(timestamp);
|
||||
} else if (typeof timestamp === "string") {
|
||||
return inWords($.timeago.parse(timestamp));
|
||||
} else if (typeof timestamp === "number") {
|
||||
return inWords(new Date(timestamp));
|
||||
} else {
|
||||
return inWords($.timeago.datetime(timestamp));
|
||||
}
|
||||
};
|
||||
var $t = $.timeago;
|
||||
|
||||
$.extend($.timeago, {
|
||||
settings: {
|
||||
refreshMillis: 60000,
|
||||
allowFuture: false,
|
||||
localeTitle: false,
|
||||
cutoff: 0,
|
||||
strings: {
|
||||
prefixAgo: null,
|
||||
prefixFromNow: null,
|
||||
suffixAgo: "ago",
|
||||
suffixFromNow: "from now",
|
||||
seconds: "less than a minute",
|
||||
minute: "about a minute",
|
||||
minutes: "%d minutes",
|
||||
hour: "about an hour",
|
||||
hours: "about %d hours",
|
||||
day: "a day",
|
||||
days: "%d days",
|
||||
month: "about a month",
|
||||
months: "%d months",
|
||||
year: "about a year",
|
||||
years: "%d years",
|
||||
wordSeparator: " ",
|
||||
numbers: []
|
||||
}
|
||||
},
|
||||
inWords: function(distanceMillis) {
|
||||
var $l = this.settings.strings;
|
||||
var prefix = $l.prefixAgo;
|
||||
var suffix = $l.suffixAgo;
|
||||
if (this.settings.allowFuture) {
|
||||
if (distanceMillis < 0) {
|
||||
prefix = $l.prefixFromNow;
|
||||
suffix = $l.suffixFromNow;
|
||||
}
|
||||
}
|
||||
|
||||
var seconds = Math.abs(distanceMillis) / 1000;
|
||||
var minutes = seconds / 60;
|
||||
var hours = minutes / 60;
|
||||
var days = hours / 24;
|
||||
var years = days / 365;
|
||||
|
||||
function substitute(stringOrFunction, number) {
|
||||
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
|
||||
var value = ($l.numbers && $l.numbers[number]) || number;
|
||||
return string.replace(/%d/i, value);
|
||||
}
|
||||
|
||||
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
|
||||
seconds < 90 && substitute($l.minute, 1) ||
|
||||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
|
||||
minutes < 90 && substitute($l.hour, 1) ||
|
||||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
|
||||
hours < 42 && substitute($l.day, 1) ||
|
||||
days < 30 && substitute($l.days, Math.round(days)) ||
|
||||
days < 45 && substitute($l.month, 1) ||
|
||||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
|
||||
years < 1.5 && substitute($l.year, 1) ||
|
||||
substitute($l.years, Math.round(years));
|
||||
|
||||
var separator = $l.wordSeparator || "";
|
||||
if ($l.wordSeparator === undefined) { separator = " "; }
|
||||
return $.trim([prefix, words, suffix].join(separator));
|
||||
},
|
||||
parse: function(iso8601) {
|
||||
var s = $.trim(iso8601);
|
||||
s = s.replace(/\.\d+/,""); // remove milliseconds
|
||||
s = s.replace(/-/,"/").replace(/-/,"/");
|
||||
s = s.replace(/T/," ").replace(/Z/," UTC");
|
||||
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
|
||||
return new Date(s);
|
||||
},
|
||||
datetime: function(elem) {
|
||||
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
|
||||
return $t.parse(iso8601);
|
||||
},
|
||||
isTime: function(elem) {
|
||||
// jQuery's `is()` doesn't play well with HTML5 in IE
|
||||
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
|
||||
}
|
||||
});
|
||||
|
||||
// functions that can be called via $(el).timeago('action')
|
||||
// init is default when no action is given
|
||||
// functions are called with context of a single element
|
||||
var functions = {
|
||||
init: function(){
|
||||
var refresh_el = $.proxy(refresh, this);
|
||||
refresh_el();
|
||||
var $s = $t.settings;
|
||||
if ($s.refreshMillis > 0) {
|
||||
setInterval(refresh_el, $s.refreshMillis);
|
||||
}
|
||||
},
|
||||
update: function(time){
|
||||
$(this).data('timeago', { datetime: $t.parse(time) });
|
||||
refresh.apply(this);
|
||||
},
|
||||
updateFromDOM: function(){
|
||||
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
|
||||
refresh.apply(this);
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.timeago = function(action, options) {
|
||||
var fn = action ? functions[action] : functions.init;
|
||||
if(!fn){
|
||||
throw new Error("Unknown function name '"+ action +"' for timeago");
|
||||
}
|
||||
// each over objects here and call the requested function
|
||||
this.each(function(){
|
||||
fn.call(this, options);
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
function refresh() {
|
||||
var data = prepareData(this);
|
||||
var $s = $t.settings;
|
||||
|
||||
if (!isNaN(data.datetime)) {
|
||||
if ( $s.cutoff == 0 || distance(data.datetime) < $s.cutoff) {
|
||||
$(this).text(inWords(data.datetime));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
function prepareData(element) {
|
||||
element = $(element);
|
||||
if (!element.data("timeago")) {
|
||||
element.data("timeago", { datetime: $t.datetime(element) });
|
||||
var text = $.trim(element.text());
|
||||
if ($t.settings.localeTitle) {
|
||||
element.attr("title", element.data('timeago').datetime.toLocaleString());
|
||||
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
|
||||
element.attr("title", text);
|
||||
}
|
||||
}
|
||||
return element.data("timeago");
|
||||
}
|
||||
|
||||
function inWords(date) {
|
||||
return $t.inWords(distance(date));
|
||||
}
|
||||
|
||||
function distance(date) {
|
||||
return (new Date().getTime() - date.getTime());
|
||||
}
|
||||
|
||||
// fix for IE6 suckage
|
||||
document.createElement("abbr");
|
||||
document.createElement("time");
|
||||
}));
|
4
js/modernizr.js
Normal file
9523
js/wysihtml5-0.3.0.js
Normal file
1
license.txt
Normal file
@ -0,0 +1 @@
|
||||
Please see file "protected/docs/license.md" for licensing details.
|
1
protected/.htaccess
Normal file
@ -0,0 +1 @@
|
||||
deny from all
|
44
protected/behaviors/HActiveRecordBehavior.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HActiveRecordBehavior is attached to all active records.
|
||||
*
|
||||
* @package humhub.behaviors
|
||||
* @since 0.5
|
||||
*/
|
||||
class HActiveRecordBehavior extends CActiveRecordBehavior {
|
||||
|
||||
/**
|
||||
* On after construct event of an active record
|
||||
*
|
||||
* @param type $event
|
||||
*/
|
||||
public function afterConstruct($event) {
|
||||
|
||||
// Intercept this controller
|
||||
Yii::app()->interceptor->intercept($this);
|
||||
|
||||
parent::afterConstruct($event);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
187
protected/behaviors/HContentAddonBehavior.php
Normal file
@ -0,0 +1,187 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HContentAddonBehavior should attached to every content addon model
|
||||
*
|
||||
* Items like Comments, Likes with linked to a
|
||||
* HContentBehavior or HContentAddonBehavior
|
||||
* Model
|
||||
*
|
||||
* An ContentAddon needs to have following DB Fields
|
||||
* - id
|
||||
* - object_model
|
||||
* - object_id
|
||||
*
|
||||
* Which should point to SIContent or SIContentAddon
|
||||
*
|
||||
* @package humhub.behaviors
|
||||
* @since 0.5
|
||||
*/
|
||||
class HContentAddonBehavior extends HActiveRecordBehavior {
|
||||
|
||||
/**
|
||||
* Cache Content Ooject and avoid multiple loading
|
||||
*
|
||||
* @var type
|
||||
*/
|
||||
private $_cacheContentObject = null;
|
||||
|
||||
/**
|
||||
* Returns an object which this Addon belongs to
|
||||
* Only Support Content -> ContentAddon -> ContentAddon
|
||||
*
|
||||
* This is always a object which have the behavior: HContentBehavior
|
||||
*
|
||||
* e.g. Post / Like
|
||||
*
|
||||
*/
|
||||
public function getContentObject() {
|
||||
|
||||
// Fastlane?
|
||||
if ($this->_cacheContentObject != null)
|
||||
return $this->_cacheContentObject;
|
||||
|
||||
$target = $this->getOwner()->getUnderlyingObject();
|
||||
|
||||
if ($target->asa('HContentBehavior') !== null) {
|
||||
$this->_cacheContentObject = $target;
|
||||
return $target;
|
||||
} elseif ($target->asa('HContentAddonBehavior') !== null) {
|
||||
$target2 = $target->getOwner()->getUnderlyingObject();
|
||||
|
||||
if ($target2->asa('HContentBehavior') !== null) {
|
||||
$this->_cacheContentObject = $target2;
|
||||
return $target2;
|
||||
}
|
||||
|
||||
# Maybe Multiple Nested?
|
||||
}
|
||||
throw new CHttpException(500, Yii::t('base', 'Invalid content object!'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given / or current user can delete this content.
|
||||
* Currently only the creator can remove.
|
||||
*
|
||||
* @param type $userId
|
||||
*/
|
||||
public function canDelete($userId = "") {
|
||||
if ($userId == "")
|
||||
$userId = Yii::app()->user->id;
|
||||
|
||||
if ($this->getOwner()->created_by == $userId)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deligate to the underlying content object
|
||||
*
|
||||
* @param type $userId
|
||||
* @return type
|
||||
*/
|
||||
public function canRead($userId = "") {
|
||||
return $this->getContentObject()->canRead($userId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this content can be changed
|
||||
*
|
||||
* @param type $userId
|
||||
* @return type
|
||||
*/
|
||||
public function canWrite($userId = "") {
|
||||
if ($userId == "")
|
||||
$userId = Yii::app()->user->id;
|
||||
|
||||
if ($this->getOwner()->created_by == $userId)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns textual title for this content addon
|
||||
*
|
||||
* @return type
|
||||
*/
|
||||
public function getContentTitle() {
|
||||
$objectModel = get_class($this->getOwner()); // e.g. Post
|
||||
|
||||
return $objectModel . " (" . $this->getOwner()->id . ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* Before saving, check target on content addon
|
||||
*/
|
||||
public function beforeSave($event) {
|
||||
|
||||
if ($this->getOwner()->getUnderlyingObject() == null)
|
||||
throw new CHttpException(500, 'Could not load comment target!');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* After saving
|
||||
*/
|
||||
public function afterSave($event) {
|
||||
// Also load corresponding SIContent Object and change "updated_at & updated_by" time
|
||||
$this->getContentObject()->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* After delete
|
||||
*/
|
||||
public function afterDelete($event) {
|
||||
// Also load corresponding SIContent Object and change "updated_at & updated_by" time
|
||||
$this->getContentObject()->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* Before deleting a SIContent try to delete all corresponding SIContentAddons.
|
||||
*/
|
||||
public function beforeDelete($event) {
|
||||
|
||||
$objectModel = get_class($this->getOwner()); // e.g. Comment
|
||||
// delete all comments (sub comments?) - not implemented yet :-)
|
||||
$comments = Comment::model()->findAllByAttributes(array('object_model' => $objectModel, 'object_id' => $this->getOwner()->id));
|
||||
foreach ($comments as $comment) {
|
||||
$comment->delete();
|
||||
}
|
||||
|
||||
// delete all likes
|
||||
$likes = Like::model()->findAllByAttributes(array('object_model' => $objectModel, 'object_id' => $this->getOwner()->id));
|
||||
foreach ($likes as $like) {
|
||||
$like->delete();
|
||||
}
|
||||
|
||||
// delete all activities
|
||||
$activities = Activity::model()->findAllByAttributes(array('object_model' => $objectModel, 'object_id' => $this->getOwner()->id));
|
||||
foreach ($activities as $activity) {
|
||||
$activity->delete();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
57
protected/behaviors/HContentBaseBehavior.php
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The SIContentBaseBahaviour is attached to all models which act as contentbase.
|
||||
*
|
||||
* A ContentBase can be Space or User. Essentially a ContentBase holds a
|
||||
* bunch of Content Objects.
|
||||
*
|
||||
* Each ContentBase should own a Wall Object.
|
||||
* A Content Base needs a GUID Database Field
|
||||
*
|
||||
* Additionally each ContentBase has a ProfileImage.
|
||||
*
|
||||
* Ideas/ToDo:
|
||||
* - GetUrl (Instead of Profile Url)
|
||||
*
|
||||
* @package humhub.behaviors
|
||||
* @since 0.5
|
||||
*/
|
||||
class HContentBaseBehavior extends HActiveRecordBehavior {
|
||||
// Auto Add Wall?
|
||||
// Auto Delete Wall?
|
||||
|
||||
/**
|
||||
* Returns the Profile Image Object for this Content Base
|
||||
*
|
||||
* @return ProfileImage
|
||||
*/
|
||||
public function getProfileImage() {
|
||||
|
||||
if (get_class($this->getOwner()) == 'Space') {
|
||||
return new ProfileImage($this->getOwner()->guid, 'default_workspace');
|
||||
}
|
||||
return new ProfileImage($this->getOwner()->guid);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
141
protected/behaviors/HContentBehavior.php
Normal file
@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Behavior for Contents Objects
|
||||
*
|
||||
* Generally binds a Content Object to the given ActiveRecord
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.behaviors
|
||||
* @since 0.5
|
||||
*/
|
||||
class HContentBehavior extends HActiveRecordBehavior {
|
||||
|
||||
private $_content = null;
|
||||
|
||||
/**
|
||||
* Before deleting of a content object (e.g. post, activity, ...)
|
||||
*
|
||||
* @param type $event
|
||||
*/
|
||||
public function beforeDelete($event) {
|
||||
parent::beforeDelete($event);
|
||||
|
||||
// Make sure corresponding content object is loaded
|
||||
// So we can delete is afterwards
|
||||
$this->getContentMeta();
|
||||
}
|
||||
|
||||
/**
|
||||
* After deleting of a content object (e.g. post, activity, ...)
|
||||
*
|
||||
* @param type $event
|
||||
*/
|
||||
public function afterDelete($event) {
|
||||
parent::afterDelete($event);
|
||||
|
||||
// Search Stuff
|
||||
if ($this->getOwner() instanceof ISearchable) {
|
||||
|
||||
if (!$this->getOwner()->isNewRecord)
|
||||
HSearch::getInstance()->deleteModel($this->getOwner());
|
||||
|
||||
HSearch::getInstance()->addModel($this->getOwner());
|
||||
}
|
||||
|
||||
$this->getContentMeta()->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* After saving of a content object (e.g. post, activity, ...)
|
||||
*
|
||||
* @param type $event
|
||||
*/
|
||||
public function afterSave($event) {
|
||||
|
||||
parent::afterSave($event);
|
||||
|
||||
if ($this->getContentMeta()->isNewRecord) {
|
||||
$this->getContentMeta()->object_model = get_class($this->getOwner());
|
||||
$this->getContentMeta()->object_id = $this->getOwner()->id;
|
||||
|
||||
// Because Content Model dont set this automatically atm
|
||||
// For update reasons
|
||||
// On later release remove this, and change Content Model to set this automatically
|
||||
$this->getContentMeta()->created_at = $this->getOwner()->created_at;
|
||||
$this->getContentMeta()->created_by = $this->getOwner()->created_by;
|
||||
$this->getContentMeta()->updated_at = $this->getOwner()->updated_at;
|
||||
$this->getContentMeta()->updated_by = $this->getOwner()->updated_by;
|
||||
}
|
||||
|
||||
$this->getContentMeta()->save();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* After finding a record
|
||||
*
|
||||
* @param type $event
|
||||
*/
|
||||
public function afterFind($event) {
|
||||
parent::afterFind($event);
|
||||
|
||||
// Make sure corresponding content object is empty
|
||||
$this->_content = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns corresponding Content (Meta) Object for underlying content class.
|
||||
*
|
||||
* ToDo: After Find Remove Existing ContentMeta Object
|
||||
* @return type
|
||||
*/
|
||||
public function getContentMeta() {
|
||||
|
||||
// Content Object already instanciated
|
||||
if ($this->_content != null)
|
||||
return $this->_content;
|
||||
|
||||
// Is new record, so return empty content object
|
||||
if ($this->getOwner()->isNewRecord) {
|
||||
$this->_content = new Content;
|
||||
|
||||
// some defaults
|
||||
$this->_content->sticked = 0;
|
||||
$this->_content->archived = 0;
|
||||
$this->_content->visibility = Content::VISIBILITY_PRIVATE;
|
||||
|
||||
return $this->_content;
|
||||
}
|
||||
|
||||
$this->_content = Content::model()->findByAttributes(array('object_model' => get_class($this->getOwner()), 'object_id' => $this->getOwner()->id));
|
||||
|
||||
if ($this->_content == null) {
|
||||
throw new CHttpException(500, Yii::t('base', 'Missing underlying content object!'));
|
||||
}
|
||||
|
||||
return $this->_content;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
98
protected/behaviors/HUnderlyingObjectBehavior.php
Normal file
@ -0,0 +1,98 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* A SIUnderlyingObjectBahavior adds the ability to models/active records
|
||||
* to link to any other model/active record.
|
||||
*
|
||||
* This is archived by the database fields object_model & object_id.
|
||||
*
|
||||
* Required database fields:
|
||||
* - object_model
|
||||
* - object_id
|
||||
*
|
||||
* @package humhub.behaviors
|
||||
* @since 0.5
|
||||
*/
|
||||
class HUnderlyingObjectBehavior extends HActiveRecordBehavior {
|
||||
|
||||
/**
|
||||
* The underlying object needs to be a "instanceof" at least one
|
||||
* of this values.
|
||||
*
|
||||
* (Its also possible to specify a CBehavior name)
|
||||
*
|
||||
* @var type
|
||||
*/
|
||||
public $mustBeInstanceOf = array();
|
||||
|
||||
/**
|
||||
* Cache Object to avoid multiple loading
|
||||
*
|
||||
* @var type
|
||||
*/
|
||||
private $_cachedObject = null;
|
||||
|
||||
/**
|
||||
* Cache Object is null
|
||||
*/
|
||||
private $_cached = false;
|
||||
|
||||
/*
|
||||
* Returns the Underlying Object
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
public function getUnderlyingObject() {
|
||||
|
||||
if ($this->_cached)
|
||||
return $this->_cachedObject;
|
||||
|
||||
$className = $this->getOwner()->object_model;
|
||||
|
||||
if ($className == "") {
|
||||
$this->_cached = true;
|
||||
return null;
|
||||
}
|
||||
|
||||
$object = $className::model()->findByPk($this->getOwner()->object_id);
|
||||
|
||||
if (count($this->mustBeInstanceOf) == 0 || $object == null) {
|
||||
$this->_cached = true;
|
||||
$this->_cachedObject = $object;
|
||||
return $object;
|
||||
}
|
||||
|
||||
// Validates object
|
||||
foreach ($this->mustBeInstanceOf as $instance) {
|
||||
if ($object instanceof $instance || $object->asa($instance) !== null) {
|
||||
$this->_cached = true;
|
||||
$this->_cachedObject = $object;
|
||||
return $object;
|
||||
}
|
||||
}
|
||||
|
||||
throw new CHttpException(500, 'Underlying object of invalid type! (' . $className . ')');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
212
protected/commands/shell/EMailing/EMailing.php
Normal file
@ -0,0 +1,212 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The E-Mailing command sends daily or hourly e-mails updates with current
|
||||
* pending activities and notification.
|
||||
*
|
||||
* @package humhub.commands.shell.EMailing
|
||||
* @since 0.5
|
||||
*/
|
||||
class EMailing extends HConsoleCommand {
|
||||
|
||||
private $mode = "hourly"; // daily
|
||||
|
||||
/**
|
||||
* Run method for EMailing System
|
||||
*
|
||||
* @param type $args
|
||||
*/
|
||||
|
||||
public function run($args) {
|
||||
|
||||
$this->printHeader('E-Mail Interface');
|
||||
|
||||
if (!isset($args[0]) || ($args[0] != "daily" && $args[0] != 'hourly')) {
|
||||
print "\n Run with parameter:\n" .
|
||||
"\t daily - for Daily Mailings\n" .
|
||||
"\t hourly - for Hourly Mailings\n";
|
||||
print "\n\n";
|
||||
exit;
|
||||
}
|
||||
$this->mode = $args[0];
|
||||
Yii::import("application.modules_core.wall.*", true);
|
||||
|
||||
Yii::app()->request->setBaseUrl(HSetting::Get('baseUrl'));
|
||||
|
||||
$users = User::model()->with('httpSessions')->findAll();
|
||||
|
||||
foreach ($users as $user) {
|
||||
|
||||
print "Processing : " . $user->email . ": ";
|
||||
|
||||
$user->checkWall();
|
||||
|
||||
$notificationContent = $this->getNotificationContent($user);
|
||||
$activityContent = $this->getActivityContent($user);
|
||||
|
||||
// Something new?
|
||||
if ($notificationContent == "" && $activityContent == "") {
|
||||
print "Nothing new! \n";
|
||||
continue;
|
||||
}
|
||||
|
||||
$message = new HMailMessage();
|
||||
$message->view = 'application.views.mail.EMailing';
|
||||
$message->addFrom(HSetting::Get('systemEmailAddress', 'mailing'), HSetting::Get('systemEmailName', 'mailing'));
|
||||
$message->addTo($user->email);
|
||||
|
||||
if ($this->mode == 'hourly') {
|
||||
$message->subject = Yii::t('base', "Latest news");
|
||||
} else {
|
||||
$message->subject = Yii::t('base', "Your daily summary");
|
||||
}
|
||||
|
||||
$message->setBody(array(
|
||||
'notificationContent' => $notificationContent,
|
||||
'activityContent' => $activityContent,
|
||||
'user' => $user,
|
||||
), 'text/html');
|
||||
Yii::app()->mail->send($message);
|
||||
|
||||
print "Sent! \n";
|
||||
}
|
||||
|
||||
print "\nEMailing completed.\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns notification content by given user.
|
||||
*
|
||||
* The output will generated on current mode.
|
||||
*
|
||||
* @param type $user
|
||||
* @return string email output
|
||||
*/
|
||||
private function getNotificationContent($user) {
|
||||
|
||||
// Never receive notifications
|
||||
if ($user->receive_email_notifications == User::RECEIVE_EMAIL_NEVER) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// We are in hourly mode and user wants daily
|
||||
if ($this->mode == 'hourly' && $user->receive_email_notifications == User::RECEIVE_EMAIL_DAILY_SUMMARY) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// We are in daily mode and user dont wants daily reports
|
||||
if ($this->mode == 'daily' && $user->receive_email_notifications != User::RECEIVE_EMAIL_DAILY_SUMMARY) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// User wants only when offline and is online
|
||||
if ($this->mode == 'hourly') {
|
||||
$isOnline = (count($user->httpSessions) > 0);
|
||||
if ($user->receive_email_notifications == User::RECEIVE_EMAIL_WHEN_OFFLINE && $isOnline) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
// Get not seen notifcation, order by created_at
|
||||
$criteria = new CDbCriteria();
|
||||
$criteria->order = 'created_at DESC';
|
||||
$notifications = Notification::model()->findAllByAttributes(array('user_id' => $user->id, 'seen' => 0, 'emailed' => 0), $criteria);
|
||||
|
||||
// Nothin new
|
||||
if (count($notifications) == 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// Generate notification output
|
||||
$output = "";
|
||||
foreach ($notifications as $notification) {
|
||||
$output .= $notification->getMailOut();
|
||||
$notification->emailed = 1;
|
||||
$notification->save();
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return activity content by given user.
|
||||
*
|
||||
* This output is generated by current mode.
|
||||
*
|
||||
* @param type $user
|
||||
* @return string
|
||||
*/
|
||||
private function getActivityContent($user) {
|
||||
|
||||
// User never wants activity content
|
||||
if ($user->receive_email_activities == User::RECEIVE_EMAIL_NEVER) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// We are in hourly mode and user wants receive a daily summary
|
||||
if ($this->mode == 'hourly' && $user->receive_email_activities == User::RECEIVE_EMAIL_DAILY_SUMMARY) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// We are in daily mode and user wants receive not daily
|
||||
if ($this->mode == 'daily' && $user->receive_email_activities != User::RECEIVE_EMAIL_DAILY_SUMMARY) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// User is online and want only receive when offline
|
||||
if ($this->mode == 'hourly') {
|
||||
$isOnline = (count($user->httpSessions) > 0);
|
||||
if ($user->receive_email_activities == User::RECEIVE_EMAIL_WHEN_OFFLINE && $isOnline) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$lastMailDate = $user->last_activity_email;
|
||||
if ($lastMailDate == "" || $lastMailDate == "0000-00-00 00:00:00") {
|
||||
$lastMailDate = new CDbExpression('NOW() - INTERVAL 24 HOUR');
|
||||
}
|
||||
|
||||
|
||||
// Get Stream contents
|
||||
$action = new StreamAction(null, 'console');
|
||||
$action->mode = 'activity';
|
||||
$action->type = 'dashboard';
|
||||
$action->userId = $user->id;
|
||||
$action->userWallId = $user->wall_id;
|
||||
$action->wallEntryLimit = 50;
|
||||
$action->wallEntryDateTo = $lastMailDate;
|
||||
$activities = $action->runConsole();
|
||||
|
||||
# Save last run
|
||||
$user->last_activity_email = new CDbExpression('NOW()');
|
||||
$user->save();
|
||||
|
||||
// Nothin new
|
||||
if ($activities['counter'] == 0) {
|
||||
return "";
|
||||
}
|
||||
|
||||
// Return Output
|
||||
return $activities['output'];
|
||||
}
|
||||
|
||||
}
|
56
protected/commands/shell/EMailing/TestMail.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* The TestMail command is used to test the e-mail subsystem.
|
||||
*
|
||||
* @package humhub.commands.shell.EMailing
|
||||
* @since 0.5
|
||||
*/
|
||||
class TestMail extends HConsoleCommand {
|
||||
|
||||
public function run($args) {
|
||||
print " E-Mail - Test Interface\n";
|
||||
print "-------------------------------------------------------------------------\n\n";
|
||||
|
||||
if (!isset($args[0]) || ($args[0] == "")) {
|
||||
print "\n Run with parameter [email]!\n" .
|
||||
print "\n\n";
|
||||
exit;
|
||||
}
|
||||
$email = $args[0];
|
||||
|
||||
$user = User::model()->findByPk(1);
|
||||
|
||||
$message = new HMailMessage();
|
||||
$message->view = 'application.views.mail.EMailing';
|
||||
$message->addFrom(HSetting::Get('systemEmailAddress', 'mailing'), HSetting::Get('systemEmailName', 'mailing'));
|
||||
$message->addTo($email);
|
||||
$message->subject = "Test Mail";
|
||||
|
||||
$message->setBody(array('user' => $user), 'text/html');
|
||||
Yii::app()->mail->send($message);
|
||||
|
||||
print "Sent! \n";
|
||||
|
||||
print "\nEMailing completed.\n";
|
||||
}
|
||||
|
||||
}
|
95
protected/commands/shell/Maintain/IntegrityChecker.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* IntegrityChecker command validates the current database and tries to fix
|
||||
* currupted records.
|
||||
*
|
||||
* Also third party modules can add checking methods by intercepting the run
|
||||
* event.
|
||||
*
|
||||
* @package humhub.commands.shell.Maintain
|
||||
* @since 0.5
|
||||
*/
|
||||
class IntegrityChecker extends HConsoleCommand {
|
||||
|
||||
public $simulate = false;
|
||||
|
||||
/**
|
||||
* Runs Integrity Checker
|
||||
*
|
||||
* @param type $args
|
||||
*/
|
||||
public function run($args) {
|
||||
|
||||
$this->printHeader('Integrity Checker');
|
||||
|
||||
if ($this->simulate) {
|
||||
print "Simulation Mode!\n\n";
|
||||
}
|
||||
|
||||
$this->doBaseTasks();
|
||||
|
||||
if ($this->hasEventHandler('onRun'))
|
||||
$this->onRun(new CEvent($this));
|
||||
|
||||
print "\n\n";
|
||||
print "Finished! Integrity Check done!\n\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Do general tasks used application whide
|
||||
*/
|
||||
protected function doBaseTasks() {
|
||||
|
||||
$this->showTestHeadline("Checking application base structure");
|
||||
|
||||
if (HSetting::Get('secret') == "" || HSetting::Get('secret') == null) {
|
||||
HSetting::Set('secret', UUID::v4());
|
||||
$this->showFix('Setting missing application secret!');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* onRun Event is used to notify modules.
|
||||
*
|
||||
* @param type $event
|
||||
*/
|
||||
public function onRun($event) {
|
||||
$this->raiseEvent('onRun', $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows a headline in console
|
||||
* @param type $title
|
||||
*/
|
||||
public function showTestHeadline($title) {
|
||||
print "*** " . $title . "\n";
|
||||
}
|
||||
|
||||
/**
|
||||
* Use this method to show a fix
|
||||
* @param type $msg
|
||||
*/
|
||||
public function showFix($msg) {
|
||||
print "\t" . $msg . "\n";
|
||||
}
|
||||
|
||||
}
|
42
protected/commands/shell/SearchIndexer/Optimize.php
Normal file
@ -0,0 +1,42 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Optimize command optimizing the search index by calling underlying
|
||||
* Zend Lucence Index optimizer.
|
||||
*
|
||||
* @package humhub.commands.shell.SearchIndexer
|
||||
* @since 0.5
|
||||
*/
|
||||
class Optimize extends HConsoleCommand {
|
||||
|
||||
public function run($args) {
|
||||
|
||||
$this->printHeader('Search Index Optimizer');
|
||||
|
||||
|
||||
print "- Optimizing ...\n";
|
||||
HSearch::getInstance()->optimize();
|
||||
print "- Search Index successfully optimized!\n";
|
||||
|
||||
print "\n";
|
||||
}
|
||||
|
||||
}
|
44
protected/commands/shell/SearchIndexer/Rebuilder.php
Normal file
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Rebuilder command purges all search index files and rebuilds the whole index.
|
||||
*
|
||||
* @package humhub.commands.shell.SearchIndexer
|
||||
* @since 0.5
|
||||
*/
|
||||
class Rebuilder extends HConsoleCommand {
|
||||
|
||||
public function run($args) {
|
||||
|
||||
$this->printHeader('Rebuild Search Index\n');
|
||||
|
||||
print "Deleting old index files: ";
|
||||
HSearch::getInstance()->flushIndex();
|
||||
print " done!\n";
|
||||
|
||||
print "Rebuilding index: ";
|
||||
HSearch::getInstance()->rebuild();
|
||||
print " done!\n";
|
||||
|
||||
print "\n";
|
||||
}
|
||||
|
||||
}
|
120
protected/commands/shell/ZCron/ZCronRunner.php
Normal file
@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ZCronRunner command is a generic cron interface.
|
||||
*
|
||||
* Third party modules can intercept run events to attach methods to the cron
|
||||
* subsystem.
|
||||
*
|
||||
* @package humhub.commands.shell.ZCron
|
||||
* @since 0.5
|
||||
*/
|
||||
class ZCronRunner extends HConsoleCommand {
|
||||
|
||||
/**
|
||||
* Cron Intervals
|
||||
*/
|
||||
const INTERVAL_DAILY = 1;
|
||||
const INTERVAL_HOURLY = 2;
|
||||
|
||||
/**
|
||||
* @var integer current interval
|
||||
*/
|
||||
public $interval = null;
|
||||
|
||||
/**
|
||||
* Run method for CronRunner
|
||||
*
|
||||
* @param type $args
|
||||
*/
|
||||
public function run($args) {
|
||||
|
||||
$this->printHeader('Cron Interface');
|
||||
|
||||
if (!isset($args[0]) || ($args[0] != "daily" && $args[0] != 'hourly')) {
|
||||
print "\n Run with parameter:\n" .
|
||||
"\t daily - for Daily Interval\n" .
|
||||
"\t hourly - for Hourly Interval \n";
|
||||
print "\n\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
// Set current interval to attribute
|
||||
if ($args[0] == 'daily')
|
||||
$this->interval = self::INTERVAL_DAILY;
|
||||
elseif ($args[0] == 'hourly')
|
||||
$this->interval = self::INTERVAL_HOURLY;
|
||||
else
|
||||
throw new CException(500, 'Invalid cron interval!');
|
||||
|
||||
// Do some base tasks, handle by event in future
|
||||
if ($this->interval == self::INTERVAL_HOURLY) {
|
||||
|
||||
// Raise Event for Module specific tasks
|
||||
if ($this->hasEventHandler('onHourlyRun'))
|
||||
$this->onHourlyRun(new CEvent($this));
|
||||
|
||||
print "- Optimizing Search Index\n";
|
||||
// Optimize Search Index
|
||||
HSearch::getInstance()->Optimize();
|
||||
|
||||
print "- Invoking EMailing hourly\n\n";
|
||||
// Execute Hourly Mailing Runner
|
||||
Yii::import('application.commands.shell.EMailing.*');
|
||||
$command = new EMailing('test', 'test');
|
||||
$command->run(array('hourly'));
|
||||
|
||||
HSetting::Set('cronLastHourlyRun', time());
|
||||
} elseif ($this->interval == self::INTERVAL_DAILY) {
|
||||
// Raise Event for Module specific tasks
|
||||
|
||||
if ($this->hasEventHandler('onDailyRun'))
|
||||
$this->onDailyRun(new CEvent($this));
|
||||
|
||||
// Execute Daily Mailing Runner
|
||||
print "- Invoking EMailing daily\n\n";
|
||||
Yii::import('application.commands.shell.EMailing.*');
|
||||
$command = new EMailing('test', 'test');
|
||||
$command->run(array('daily'));
|
||||
|
||||
HSetting::Set('cronLastDailyRun', time());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This event is raised after the cron hourly run is performed.
|
||||
*
|
||||
* @param CEvent $event the event parameter
|
||||
*/
|
||||
public function onHourlyRun($event) {
|
||||
$this->raiseEvent('onHourlyRun', $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* This event is raised after the cron hourly run is performed.
|
||||
*
|
||||
* @param CEvent $event the event parameter
|
||||
*/
|
||||
public function onDailyRun($event) {
|
||||
$this->raiseEvent('onDailyRun', $event);
|
||||
}
|
||||
|
||||
}
|
91
protected/commands/shell/ZDbMigration.php
Normal file
@ -0,0 +1,91 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ZDbMigration extends EDbMigration with better interactive support.
|
||||
*
|
||||
* @package humhub.commands
|
||||
* @since 0.5
|
||||
*/
|
||||
class ZDbMigration extends CDbMigration {
|
||||
|
||||
/**
|
||||
* @var EMigrateCommand
|
||||
*/
|
||||
private $migrateCommand;
|
||||
protected $interactive = true;
|
||||
|
||||
/**
|
||||
* @param EMigrateCommand $migrateCommand
|
||||
*/
|
||||
public function setCommand($migrateCommand) {
|
||||
$this->migrateCommand = $migrateCommand;
|
||||
$this->interactive = $migrateCommand->interactive;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see CConsoleCommand::confirm()
|
||||
* @param string $message
|
||||
* @return bool
|
||||
*/
|
||||
public function confirm($message) {
|
||||
if (!$this->interactive) {
|
||||
return true;
|
||||
}
|
||||
return $this->migrateCommand->confirm($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see CConsoleCommand::prompt()
|
||||
* @param string $message
|
||||
* @param mixed $defaultValue will be returned when interactive is false
|
||||
* @return string
|
||||
*/
|
||||
public function prompt($message, $defaultValue) {
|
||||
if (!$this->interactive) {
|
||||
return $defaultValue;
|
||||
}
|
||||
return $this->migrateCommand->prompt($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Executes a SQL statement. Silently. (only show sql on exception)
|
||||
* This method executes the specified SQL statement using {@link dbConnection}.
|
||||
* @param string $sql the SQL statement to be executed
|
||||
* @param array $params input parameters (name=>value) for the SQL execution. See {@link CDbCommand::execute} for more details.
|
||||
* @param boolean $verbose
|
||||
*/
|
||||
public function execute($sql, $params = array(), $verbose = true) {
|
||||
if ($verbose) {
|
||||
parent::execute($sql, $params);
|
||||
} else {
|
||||
try {
|
||||
echo " > execute SQL ...";
|
||||
$time = microtime(true);
|
||||
$this->getDbConnection()->createCommand($sql)->execute($params);
|
||||
echo " done (time: " . sprintf('%.3f', microtime(true) - $time) . "s)\n";
|
||||
} catch (CException $e) {
|
||||
echo " failed.\n\n";
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
149
protected/commands/shell/ZMessageCommand.php
Normal file
@ -0,0 +1,149 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
Yii::import('application.vendors.yii.cli.commands.shell.*');
|
||||
|
||||
/**
|
||||
* ZMessageCommand extends Yiis MessageCommand with better module support.
|
||||
*
|
||||
* - Also add module messages into module/messages dir.
|
||||
*
|
||||
* @package humhub.commands
|
||||
* @since 0.5
|
||||
*/
|
||||
class ZMessageCommand extends MessageCommand {
|
||||
|
||||
/**
|
||||
* Execute the action.
|
||||
* @param array command line parameters specific for this command
|
||||
*/
|
||||
public function run($args) {
|
||||
|
||||
if (!isset($args[0]))
|
||||
$this->usageError('the configuration file is not specified.');
|
||||
if (!is_file($args[0]))
|
||||
$this->usageError("the configuration file {$args[0]} does not exist.");
|
||||
|
||||
$config = require_once($args[0]);
|
||||
$translator = 'Yii::t';
|
||||
extract($config);
|
||||
|
||||
if (!isset($sourcePath, $messagePath, $languages))
|
||||
$this->usageError('The configuration file must specify "sourcePath", "messagePath" and "languages".');
|
||||
if (!is_dir($sourcePath))
|
||||
$this->usageError("The source path $sourcePath is not a valid directory.");
|
||||
if (!is_dir($messagePath))
|
||||
$this->usageError("The message path $messagePath is not a valid directory.");
|
||||
if (empty($languages))
|
||||
$this->usageError("Languages cannot be empty.");
|
||||
|
||||
if (!isset($overwrite))
|
||||
$overwrite = false;
|
||||
|
||||
if (!isset($removeOld))
|
||||
$removeOld = false;
|
||||
|
||||
if (!isset($sort))
|
||||
$sort = false;
|
||||
|
||||
$options = array();
|
||||
if (isset($fileTypes))
|
||||
$options['fileTypes'] = $fileTypes;
|
||||
if (isset($exclude))
|
||||
$options['exclude'] = $exclude;
|
||||
$files = CFileHelper::findFiles(realpath($sourcePath), $options);
|
||||
|
||||
$messages = array();
|
||||
foreach ($files as $file)
|
||||
$messages = array_merge_recursive($messages, $this->extractMessages($file, $translator));
|
||||
|
||||
|
||||
foreach ($messages as $category => $msgs) {
|
||||
|
||||
$dir = "";
|
||||
if (($pos = strpos($category, '.')) !== false) {
|
||||
$parts = explode(".", $category);
|
||||
$className = $parts[0];
|
||||
|
||||
if (!$this->isModuleClassDefined($className)) {
|
||||
print "Skip not enabled module: " . $className . "\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get base Path of Module
|
||||
$class = new ReflectionClass($className);
|
||||
$dir = dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'messages' . DIRECTORY_SEPARATOR;
|
||||
|
||||
$category = $parts[1];
|
||||
} else {
|
||||
$dir = $messagePath . DIRECTORY_SEPARATOR;
|
||||
}
|
||||
|
||||
// Skip when there is no message dir
|
||||
if (!is_dir($dir)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($languages as $language) {
|
||||
$messageDir = $dir . DIRECTORY_SEPARATOR . $language;
|
||||
if (!is_dir($messageDir))
|
||||
@mkdir($messageDir);
|
||||
|
||||
$msgs = array_values(array_unique($msgs));
|
||||
$this->generateMessageFile($msgs, $messageDir . DIRECTORY_SEPARATOR . $category . '.php', $overwrite, $removeOld, $sort);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function extractMessages($fileName, $translator) {
|
||||
echo "Extracting messages from $fileName...\n";
|
||||
$subject = file_get_contents($fileName);
|
||||
$messages = array();
|
||||
if (!is_array($translator))
|
||||
$translator = array($translator);
|
||||
|
||||
foreach ($translator as $currentTranslator) {
|
||||
$n = preg_match_all('/\b' . $currentTranslator . '\s*\(\s*(\'[\w.]*?(?<!\.)\'|"[\w.]*?(?<!\.)")\s*,\s*(\'.*?(?<!\\\\)\'|".*?(?<!\\\\)")\s*[,\)]/s', $subject, $matches, PREG_SET_ORDER);
|
||||
|
||||
for ($i = 0; $i < $n; ++$i) {
|
||||
$category = substr($matches[$i][1], 1, -1);
|
||||
$message = $matches[$i][2];
|
||||
$messages[$category][] = eval("return $message;"); // use eval to eliminate quote escape
|
||||
}
|
||||
}
|
||||
return $messages;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if given module is registered to the yii application.
|
||||
* This is needed to prevent class autoload errrors when module/class is not enabled.
|
||||
*
|
||||
* @param type $className
|
||||
* @return boolean
|
||||
*/
|
||||
public function isModuleClassDefined($className) {
|
||||
foreach (Yii::app()->modules as $mod) {
|
||||
if (strpos($mod['class'], $className) !== false) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
94
protected/commands/shell/ZMigrateCommand.php
Normal file
@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'ZDbMigration.php');
|
||||
Yii::import('application.extensions.migrate-command.EMigrateCommand');
|
||||
|
||||
/**
|
||||
* ZMigrateCommand extends EMigrateCommand with better interactive support.
|
||||
*
|
||||
* @package humhub.commands
|
||||
* @since 0.5
|
||||
*/
|
||||
class ZMigrateCommand extends EMigrateCommand {
|
||||
|
||||
public $migrationTable = 'migration';
|
||||
|
||||
public static function AutoMigrate() {
|
||||
|
||||
|
||||
/** $commandPath = Yii::app()->getBasePath() . DIRECTORY_SEPARATOR . 'commands';
|
||||
$runner->addCommands($commandPath);
|
||||
$commandPath = Yii::getFrameworkPath() . DIRECTORY_SEPARATOR . 'cli' . DIRECTORY_SEPARATOR . 'commands';
|
||||
$runner->addCommands($commandPath); */
|
||||
$runner = new CConsoleCommandRunner();
|
||||
|
||||
$runner->commands = array(
|
||||
'migrate' => array(
|
||||
'class' => 'applications.commands.shell.ZMigrateCommand',
|
||||
'interactive' => false,
|
||||
),
|
||||
);
|
||||
|
||||
$args = array('yiic', 'migrate', '--interactive=0');
|
||||
ob_start();
|
||||
$runner->run($args);
|
||||
return htmlentities(ob_get_clean(), null, Yii::app()->charset);
|
||||
}
|
||||
|
||||
public function init() {
|
||||
print "Autodetecting Modules....\n";
|
||||
|
||||
$modulePaths = array();
|
||||
foreach (Yii::app()->moduleManager->getRegisteredModules() as $moduleId => $moduleInfo) {
|
||||
|
||||
// Convert path.to.example.ExampleModule to path.to.example.migrations
|
||||
$path = explode(".", $moduleInfo['class']);
|
||||
array_pop($path);
|
||||
$path[] = $this->migrationSubPath;
|
||||
$migrationPath = implode(".", $path);
|
||||
|
||||
if (is_dir(Yii::getPathOfAlias($migrationPath))) {
|
||||
$modulePaths[$moduleId] = $migrationPath;
|
||||
}
|
||||
}
|
||||
|
||||
$this->modulePaths = $modulePaths;
|
||||
}
|
||||
|
||||
protected function instantiateMigration($class) {
|
||||
|
||||
$migration = new $class;
|
||||
$migration->setDbConnection($this->getDbConnection());
|
||||
if ($migration instanceof EDbMigration) {
|
||||
/** @var EDbMigration $migration */
|
||||
$migration->setCommand($this);
|
||||
}
|
||||
return $migration;
|
||||
}
|
||||
|
||||
protected function getTemplate() {
|
||||
if ($this->templateFile !== null) {
|
||||
return parent::getTemplate();
|
||||
} else {
|
||||
return str_replace('CDbMigration', 'ZDbMigration', parent::getTemplate());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
170
protected/components/Controller.php
Normal file
@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Controller is the customized base controller class.
|
||||
* All controller classes for this application should extend from this base class.
|
||||
*
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class Controller extends CController {
|
||||
|
||||
/**
|
||||
* @var string the default layout for the controller view. Defaults to '//layouts/column1',
|
||||
* meaning using a single column layout. See 'protected/views/layouts/column1.php'.
|
||||
*/
|
||||
public $layout = '//layouts/main';
|
||||
|
||||
/**
|
||||
* @var string the sub layout for the controller view. Defaults to '',
|
||||
*/
|
||||
public $subLayout = '';
|
||||
|
||||
/**
|
||||
* @var array context menu items. This property will be assigned to {@link CMenu::items}.
|
||||
*/
|
||||
public $menu = array();
|
||||
|
||||
/**
|
||||
* @var array the breadcrumbs of the current page. The value of this property will
|
||||
* be assigned to {@link CBreadcrumbs::links}. Please refer to {@link CBreadcrumbs::links}
|
||||
* for more details on how to specify this property.
|
||||
*/
|
||||
public $breadcrumbs = array();
|
||||
public $snippets = array();
|
||||
|
||||
/**
|
||||
* Minimum required database version (HSetting)
|
||||
*
|
||||
* @var type
|
||||
*/
|
||||
#protected $requiredDbVersion = 28;
|
||||
|
||||
/**
|
||||
* Inits the controller class.
|
||||
*
|
||||
* - Force Installer when not HumHub is not installed yet.
|
||||
* - Registers Event Interceptor
|
||||
* - Loads Basic HSetting
|
||||
* - Set Language
|
||||
* - Check Database Version
|
||||
*/
|
||||
public function init() {
|
||||
|
||||
Yii::app()->interceptor->intercept($this);
|
||||
|
||||
// Force installer, when not installed
|
||||
if (!Yii::app()->params['installed']) {
|
||||
if ($this->getModule() != null && $this->getModule()->id == "installer") {
|
||||
return parent::init();
|
||||
}
|
||||
$this->redirect(array('//installer/index'));
|
||||
}
|
||||
|
||||
// Switch to correct user language
|
||||
if (Yii::app()->user->language) {
|
||||
Yii::app()->language = Yii::app()->user->language;
|
||||
}
|
||||
|
||||
// Enable Jquery Globally
|
||||
Yii::app()->clientScript->registerCoreScript('jquery');
|
||||
|
||||
// Tweaks for Ajax Requests
|
||||
Yii::app()->user->loginRequiredAjaxResponse = "<script>window.location.href = '" . Yii::app()->user->id . "';</script>";
|
||||
if (Yii::app()->request->isAjaxRequest) {
|
||||
Yii::app()->clientScript->scriptMap = array(
|
||||
'jquery.js' => false,
|
||||
);
|
||||
}
|
||||
|
||||
// Set a javascript variable which holds the Name and the Value of the CSRF Variable.
|
||||
Yii::app()->clientScript->setJavascriptVariable('csrfName', Yii::app()->request->csrfTokenName);
|
||||
Yii::app()->clientScript->setJavascriptVariable('csrfValue', Yii::app()->request->csrfToken);
|
||||
Yii::app()->clientScript->setJavascriptVariable('baseUrl', Yii::app()->getBaseUrl(true));
|
||||
|
||||
return parent::init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Redirect for AJAX Requests which output goes into HTML content.
|
||||
* Is an alternative method to redirect, for ajax responses.
|
||||
*/
|
||||
public function htmlRedirect($url = "") {
|
||||
|
||||
echo "<script>\n";
|
||||
|
||||
// If current URL == New Url (absolute || relative) then only Refresh
|
||||
echo "if (window.location.pathname+window.location.search+window.location.hash == '" . $url . "' || '" . $url . "' == window.location.href) { \n";
|
||||
|
||||
//echo "window.location.reload();\n"; // Drops warning on Posts
|
||||
// Remove test.php#xy (#xy) part
|
||||
$temp = explode("#", $url);
|
||||
$url = $temp[0];
|
||||
|
||||
echo "if (window.location.search == '') {\n";
|
||||
echo "window.location.href = '" . $url . "?c=" . time() . "';\n";
|
||||
echo "} else { \n";
|
||||
echo "window.location.href = '" . $url . "&c=" . time() . "';\n";
|
||||
echo "} \n";
|
||||
|
||||
// When completly new url, set new window location
|
||||
echo "} else { \n";
|
||||
echo "window.location.href = '" . $url . "';\n";
|
||||
echo "} \n";
|
||||
echo "</script>\n";
|
||||
Yii::app()->end();
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs a given JSON Array and ends the application
|
||||
*
|
||||
* @param type $json
|
||||
*/
|
||||
protected function renderJson($json) {
|
||||
echo CJSON::encode($json);
|
||||
Yii::app()->end();
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensures the current request is a post, when not throw an error
|
||||
*/
|
||||
public function forcePostRequest() {
|
||||
if (!Yii::app()->request->isPostRequest) {
|
||||
throw new CHttpException(500, Yii::t('base', 'Invalid request.'));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes a modal
|
||||
*/
|
||||
public function renderModalClose() {
|
||||
|
||||
// close modal to hide the loaded view, which is visible for some seconds, after creation
|
||||
echo "<script>";
|
||||
echo "$('#globalModal').modal('hide')";
|
||||
echo "</script>";
|
||||
//Yii::app()->end();
|
||||
}
|
||||
|
||||
}
|
116
protected/components/HActiveRecord.php
Normal file
@ -0,0 +1,116 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HActiveRecord is an extended version of the CActiveRecord.
|
||||
*
|
||||
* Each HActiveRecord has some extra meta database fields like:
|
||||
* - created by
|
||||
* - created_at
|
||||
* - updated_by
|
||||
* - updated_at
|
||||
*
|
||||
* The underlying HActiveRecord table must have these fields.
|
||||
*
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
abstract class HActiveRecord extends CActiveRecord {
|
||||
|
||||
// Avoid Errors when fields not exists
|
||||
public $created_at;
|
||||
public $created_by;
|
||||
public $updated_at;
|
||||
public $updated_by;
|
||||
|
||||
/**
|
||||
* Inits the active records and registers the event interceptor
|
||||
*/
|
||||
public function init() {
|
||||
|
||||
parent::init();
|
||||
|
||||
// Intercept this controller
|
||||
Yii::app()->interceptor->intercept($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepares create_time, create_user_id, update_time and update_user_id attributes before performing validation.
|
||||
*/
|
||||
protected function beforeValidate() {
|
||||
|
||||
// Check if we got an user object
|
||||
if (isset(Yii::app()->user)) {
|
||||
$userId = Yii::app()->user->id;
|
||||
} else {
|
||||
$userId = 0;
|
||||
}
|
||||
|
||||
|
||||
if ($this->isNewRecord) {
|
||||
// set the create date, last updated date and the user doing the creating
|
||||
$this->created_at = $this->created_at = new CDbExpression('NOW()');
|
||||
if ($this->created_by == "")
|
||||
$this->created_by = $userId;
|
||||
}
|
||||
|
||||
// Dont update in this scenario (UserSpaceMembership, only changed column is "last_visit")
|
||||
if ($this->scenario != 'last_visit' && $userId != 0) {
|
||||
|
||||
//not a new record, so just set the last updated time and last updated user id
|
||||
$this->updated_at = new CDbExpression('NOW()');
|
||||
if ($this->updated_by == "")
|
||||
$this->updated_by = $userId;
|
||||
}
|
||||
|
||||
|
||||
return parent::beforeValidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the creator user of this active record
|
||||
* (Faster than relation() because cached).
|
||||
*
|
||||
* @return User
|
||||
*/
|
||||
public function getCreator() {
|
||||
return User::model()->findByPk($this->created_by);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the updater user of this active record
|
||||
* (Faster than relation() because cached).
|
||||
*
|
||||
* @return User
|
||||
*/
|
||||
public function getUpdater() {
|
||||
return User::model()->findByPk($this->updated_by);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a unique id for this record
|
||||
*
|
||||
* @return String Unique Id of this record
|
||||
*/
|
||||
public function getUniqueId() {
|
||||
return get_class($this) . "_" . $this->id;
|
||||
}
|
||||
|
||||
}
|
97
protected/components/HActiveRecordContent.php
Normal file
@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HActiveRecordContent is the base activerecord for content objects.
|
||||
*
|
||||
* Each model which represents a content should derived from it.
|
||||
* (e.g. Post, Question, Task, Note, ...)
|
||||
*
|
||||
* It automatically adds the HContentBehavior which binds a 'contentMeta'
|
||||
* attribute, that always points to a Content Model Record.
|
||||
* (See SiContentBavior for more details.)
|
||||
*
|
||||
* The Content Model is responsible for
|
||||
* - Content to User/Space Binding
|
||||
* - Access Controlling
|
||||
* - Wall Integration
|
||||
* - ...
|
||||
* (See Content Model for more details.)
|
||||
*
|
||||
* Cleanup:
|
||||
* On workspace or user deletion, this objects will automatically deleted.
|
||||
*
|
||||
* Note: Comments, Likes or Files are NOT Content Objects. These objects are
|
||||
* ContentAddons (HActiveRecordContentAddon) which always belongs to one
|
||||
* Content Object.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HActiveRecordContent extends HActiveRecord {
|
||||
|
||||
/**
|
||||
* Extended Constructor which automatically attaches
|
||||
* the HContentBehavior to the objects.
|
||||
*
|
||||
* @param type $scenario
|
||||
*/
|
||||
public function __construct($scenario = 'insert') {
|
||||
|
||||
parent::__construct($scenario);
|
||||
|
||||
$this->attachBehavior('HContentBehavior', array(
|
||||
'class' => 'application.behaviors.HContentBehavior'
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a short textual title for this content.
|
||||
* Default goes to "Classname (Id)"
|
||||
*
|
||||
* It should be overwritten for a more representative text.
|
||||
*
|
||||
* @return type
|
||||
*/
|
||||
public function getContentTitle() {
|
||||
$objectModel = get_class($this); // e.g. Post
|
||||
return $objectModel . " (" . $this->getOwner()->id . ")";
|
||||
}
|
||||
|
||||
/**
|
||||
* If the content should also displayed on a wall, overwrite this
|
||||
* method and produce a wall output.
|
||||
*
|
||||
* e.g.
|
||||
* return Yii::app()->getController()->widget('application.modules.myModule.MyContentWidget',
|
||||
* array('myContent' => $this),
|
||||
* true
|
||||
* );
|
||||
*
|
||||
* @return type
|
||||
*/
|
||||
public function getWallOut() {
|
||||
return "Default Wall Output for Class " . get_class($this->getOwner());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
34
protected/components/HActiveRecordContentAddon.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HActiveRecordContentAddon is the base active record for content addons.
|
||||
*
|
||||
* Content addons are content types as example Likes, Comments or Files.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HActiveRecordContentAddon extends HActiveRecord {
|
||||
|
||||
}
|
||||
|
||||
?>
|
69
protected/components/HAjaxLinkPager.php
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HAjaxLinkPager extends the CLinkPager with some ajax functions.
|
||||
*
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HAjaxLinkPager extends CLinkPager {
|
||||
|
||||
/**
|
||||
* @var String html dom id of target
|
||||
*/
|
||||
public $ajaxContentTarget = "SomeCoolDivId";
|
||||
|
||||
/**
|
||||
* @var ind counter
|
||||
*/
|
||||
protected $ajaxIdCounter = 0;
|
||||
|
||||
/**
|
||||
* Creates a page button.
|
||||
*
|
||||
* You may override this method to customize the page buttons.
|
||||
* @param string $label the text label for the button
|
||||
* @param integer $page the page number
|
||||
* @param string $class the CSS class for the page button. This could be 'page', 'first', 'last', 'next' or 'previous'.
|
||||
* @param boolean $hidden whether this page button is visible
|
||||
* @param boolean $selected whether this page button is selected
|
||||
*
|
||||
* @return string the generated button
|
||||
*/
|
||||
protected function createPageButton($label, $page, $class, $hidden, $selected) {
|
||||
|
||||
$this->ajaxIdCounter++; // For Unique Ajax Link IDs
|
||||
|
||||
if ($hidden || $selected)
|
||||
$class.=' ' . ($hidden ? self::CSS_HIDDEN_PAGE : self::CSS_SELECTED_PAGE);
|
||||
|
||||
$ajaxLink = HHtml::ajaxLink(
|
||||
$label, $this->createPageUrl($page), array(
|
||||
'success' => "function(html) { jQuery('" . $this->ajaxContentTarget . "').replaceWith(html); }",
|
||||
), array(
|
||||
'id' => "siPaginatorLink_" . $page . "_" . $this->ajaxIdCounter,
|
||||
)
|
||||
);
|
||||
|
||||
return '<li class="' . $class . '">' . $ajaxLink . '</li>';
|
||||
}
|
||||
|
||||
}
|
129
protected/components/HClientScript.php
Normal file
@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HClientScript extends the CClientScript
|
||||
*
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HClientScript extends CClientScript {
|
||||
|
||||
/**
|
||||
* @var array the registered HTML code blocks (key => code)
|
||||
*/
|
||||
public $htmls = array();
|
||||
|
||||
/**
|
||||
* Method to inject a javascript variable
|
||||
*
|
||||
* @param String $name
|
||||
* @param String $value
|
||||
*/
|
||||
public function setJavascriptVariable($name, $value) {
|
||||
|
||||
$jsCode = "var " . $name . " = '" . $value . "';\n";
|
||||
$this->registerScript('jsVar_' . $name, $jsCode, CClientScript::POS_BEGIN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a script file
|
||||
*
|
||||
* @param String $src
|
||||
* @param String $position
|
||||
*/
|
||||
public function registerScriptFile($src, $position = NULL) {
|
||||
|
||||
# if(Yii::app()->getRequest()->getIsAjaxRequest()) {
|
||||
# Yii::app()->clientScript->registerScript('loadScript_'.$src, "loadJavaScript(\"".$src."\");", CClientScript::POS_BEGIN);
|
||||
# } else {
|
||||
return parent::registerScriptFile($src, $position);
|
||||
# }
|
||||
#registerScriptFile
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a piece of html code.
|
||||
* @param string $id ID that uniquely identifies this piece of HTML code
|
||||
* @param string $html the html code
|
||||
*
|
||||
* @return CClientScript the CClientScript object itself (to support method chaining, available since version 1.1.5).
|
||||
*/
|
||||
public function registerHtml($id, $html) {
|
||||
|
||||
$this->hasScripts = true;
|
||||
|
||||
$this->htmls[$id] = $html;
|
||||
|
||||
$params = func_get_args();
|
||||
$this->recordCachingAction('clientScript', 'registerScript', $params);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts the scripts and other html snippets at the end of the body section.
|
||||
*
|
||||
* @param string $output the output to be inserted with scripts.
|
||||
*/
|
||||
public function renderBodyEnd(&$output) {
|
||||
if (!isset($this->scriptFiles[self::POS_END]) && !isset($this->scripts[self::POS_END]) && !isset($this->scripts[self::POS_READY]) && !isset($this->scripts[self::POS_LOAD]) && !count($this->htmls) == 0)
|
||||
return;
|
||||
|
||||
$fullPage = 0;
|
||||
$output = preg_replace('/(<\\/body\s*>)/is', '<###end###>$1', $output, 1, $fullPage);
|
||||
$html = '';
|
||||
if (isset($this->scriptFiles[self::POS_END])) {
|
||||
foreach ($this->scriptFiles[self::POS_END] as $scriptFile)
|
||||
$html.=CHtml::scriptFile($scriptFile) . "\n";
|
||||
}
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// Begin Custom
|
||||
foreach ($this->htmls as $id => $htmlSnippet) {
|
||||
$html .= $htmlSnippet;
|
||||
}
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
|
||||
$scripts = isset($this->scripts[self::POS_END]) ? $this->scripts[self::POS_END] : array();
|
||||
if (isset($this->scripts[self::POS_READY])) {
|
||||
if ($fullPage)
|
||||
$scripts[] = "jQuery(function($) {\n" . implode("\n", $this->scripts[self::POS_READY]) . "\n});";
|
||||
else
|
||||
$scripts[] = implode("\n", $this->scripts[self::POS_READY]);
|
||||
}
|
||||
if (isset($this->scripts[self::POS_LOAD])) {
|
||||
if ($fullPage)
|
||||
$scripts[] = "jQuery(window).on('load',function() {\n" . implode("\n", $this->scripts[self::POS_LOAD]) . "\n});";
|
||||
else
|
||||
$scripts[] = implode("\n", $this->scripts[self::POS_LOAD]);
|
||||
}
|
||||
if (!empty($scripts))
|
||||
$html.=CHtml::script(implode("\n", $scripts)) . "\n";
|
||||
|
||||
if ($fullPage)
|
||||
$output = str_replace('<###end###>', $html, $output);
|
||||
else
|
||||
$output = $output . $html;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
76
protected/components/HConsoleApplication.php
Normal file
@ -0,0 +1,76 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HConsoleApplication is used as base console application.
|
||||
*
|
||||
* HConsoleApplication extends the default console application with some
|
||||
* functionalities about events and theming support.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.8
|
||||
*/
|
||||
class HConsoleApplication extends CConsoleApplication {
|
||||
|
||||
/**
|
||||
* Current theme name
|
||||
*
|
||||
* @var String
|
||||
*/
|
||||
public $theme;
|
||||
|
||||
/**
|
||||
* Initializes the console application and setup some event handlers
|
||||
*/
|
||||
protected function init() {
|
||||
|
||||
parent::init();
|
||||
|
||||
$this->interceptor->start();
|
||||
$this->interceptor->intercept($this);
|
||||
|
||||
$this->moduleManager->start();
|
||||
|
||||
if ($this->hasEventHandler('onInit'))
|
||||
$this->onInit(new CEvent($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Raised after the application inits.
|
||||
* @param CEvent $event the event parameter
|
||||
*/
|
||||
public function onInit($event) {
|
||||
$this->raiseEvent('onInit', $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a new command to the Console Application
|
||||
*
|
||||
* @param String $name
|
||||
* @param String $file
|
||||
*/
|
||||
public function addCommand($name, $file) {
|
||||
$this->getCommandRunner()->commands[$name] = $file;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
50
protected/components/HConsoleApplicationBehavior.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HConsoleApplicationBehavior is added to all console applications.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HConsoleApplicationBehavior extends CBehavior {
|
||||
|
||||
/**
|
||||
* Adds a null view renderer.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function getViewRenderer() {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns null theme.
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function getTheme() {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
73
protected/components/HConsoleCommand.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HConsoleCommand extends the default CConsoleCommand.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HConsoleCommand extends CConsoleCommand {
|
||||
|
||||
/**
|
||||
* Inits the command and prepares the base environment.
|
||||
*/
|
||||
public function init() {
|
||||
|
||||
Yii::app()->interceptor->intercept($this);
|
||||
|
||||
Yii::import('application.vendors.*');
|
||||
require_once('adLDAP/adLDAP.php');
|
||||
|
||||
EZendAutoloader::$prefixes = array('Zend', 'Custom');
|
||||
Yii::import("ext.yiiext.components.zendAutoloader.EZendAutoloader", true);
|
||||
Yii::registerAutoloader(array("EZendAutoloader", "loadClass"), true);
|
||||
|
||||
ini_set('max_execution_time', 9000);
|
||||
ini_set('memory_limit', '1024M');
|
||||
date_default_timezone_set("Europe/Berlin");
|
||||
|
||||
error_reporting(E_ALL ^ E_NOTICE);
|
||||
|
||||
#HSetting::InstallBase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prints out the console application header
|
||||
*
|
||||
* @param String $title is the title of the command
|
||||
*/
|
||||
protected function printHeader($title) {
|
||||
|
||||
print "
|
||||
|
||||
|
||||
HumHub Console Interface - Version 1
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
$title
|
||||
--------------------------------------------------------------------------------\n
|
||||
\n";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
49
protected/components/HHttpRequest.php
Normal file
@ -0,0 +1,49 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HHttpRequest extends the CHttpRequest.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HHttpRequest extends CHttpRequest {
|
||||
|
||||
public $csrfTokenName = 'CSRF_TOKEN';
|
||||
|
||||
/**
|
||||
* Returns whether this is an AJAX (XMLHttpRequest) request.
|
||||
* @return boolean whether this is an AJAX (XMLHttpRequest) request.
|
||||
*/
|
||||
public function getIsAjaxRequest() {
|
||||
|
||||
if (!parent::getIsAjaxRequest()) {
|
||||
if (isset($_REQUEST['ajax'])) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
92
protected/components/HInterceptor.php
Normal file
@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HInterceptor allows modules to attach events and behaviors to all SIComponents.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HInterceptor extends CApplicationComponent {
|
||||
|
||||
/**
|
||||
* @var Array list of events and callbacks
|
||||
*/
|
||||
private $events = array();
|
||||
|
||||
/**
|
||||
* Starts interceptor service
|
||||
*/
|
||||
public function start() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercepts a given object instance
|
||||
*
|
||||
* @param Object $obj
|
||||
*/
|
||||
public function intercept($obj) {
|
||||
|
||||
// Attach Event Handler for this class
|
||||
$className = get_class($obj);
|
||||
if (isset($this->events[$className])) {
|
||||
foreach ($this->events[$className] as $event) {
|
||||
$obj->attachEventHandler($event[0], $event[1]);
|
||||
}
|
||||
}
|
||||
|
||||
// Install also for parent classes
|
||||
$parentClassName = get_parent_class($className);
|
||||
while ($parentClassName !== false) {
|
||||
if (isset($this->events[$parentClassName])) {
|
||||
foreach ($this->events[$parentClassName] as $event) {
|
||||
$obj->attachEventHandler($event[0], $event[1]);
|
||||
}
|
||||
}
|
||||
$parentClassName = get_parent_class($parentClassName);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Attaches an event handler
|
||||
*
|
||||
* @param String $className
|
||||
* @param String $eventName
|
||||
* @param type $handler
|
||||
*/
|
||||
public function attachEventHandler($className, $eventName, $handler=null) {
|
||||
|
||||
# if ($className == 'ModuleManager') {#
|
||||
# // There is already an instance
|
||||
# Yii::app()->moduleManager->attachEventHandler($eventName, $handler);
|
||||
# return;
|
||||
#}
|
||||
|
||||
if (!isset($this->events[$className]))
|
||||
$this->events[$className] = array();
|
||||
|
||||
$this->events[$className][] = array($eventName, $handler);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
97
protected/components/HMailMessage.php
Normal file
@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HMailMessage is a changed version of the YiiMailMessage class.
|
||||
* Its supports better theming support and allows mail views in different folders.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HMailMessage extends YiiMailMessage {
|
||||
|
||||
/**
|
||||
* Set the body of this entity, either as a string, or array of view
|
||||
* variables if a view is set, or as an instance of
|
||||
* {@link Swift_OutputByteStream}.
|
||||
*
|
||||
* @param mixed the body of the message. If a $this->view is set and this
|
||||
* is a string, this is passed to the view as $body. If $this->view is set
|
||||
* and this is an array, the array values are passed to the view like in the
|
||||
* controller render() method
|
||||
* @param string content type optional. For html, set to 'html/text'
|
||||
* @param string charset optional
|
||||
*/
|
||||
public function setBody($body = '', $contentType = null, $charset = null) {
|
||||
if ($this->view !== null) {
|
||||
if (!is_array($body))
|
||||
$body = array('body' => $body);
|
||||
|
||||
// if Yii::app()->controller doesn't exist create a dummy
|
||||
// controller to render the view (needed in the console app)
|
||||
if (isset(Yii::app()->controller))
|
||||
$controller = Yii::app()->controller;
|
||||
else
|
||||
$controller = new CController('YiiMail');
|
||||
|
||||
// File Path to Template
|
||||
$viewPath = "";
|
||||
|
||||
// Name of current theme if enabled
|
||||
$themeName = "";
|
||||
|
||||
if (Yii::app() instanceOf CConsoleApplication) {
|
||||
// ConsoleApplication
|
||||
Yii::setPathOfAlias('webroot', '../' . dirname($_SERVER['SCRIPT_FILENAME']));
|
||||
|
||||
if (Yii::app()->theme && Yii::app()->theme != "") {
|
||||
$themeName = Yii::app()->theme;
|
||||
}
|
||||
} else {
|
||||
// WebApplication
|
||||
if (($theme = Yii::app()->getTheme()) !== null) {
|
||||
$themeName = $theme->getName();
|
||||
}
|
||||
}
|
||||
|
||||
// When ThemeName is speified
|
||||
if ($themeName != "") {
|
||||
$viewThemed = str_replace('application.views.', 'webroot.themes.' . $themeName . '.views.', $this->view);
|
||||
$viewThemed = preg_replace('/application\.modules(?:_core)?\.(.*?)\.views\.(.*)/i', 'webroot.themes.' . $themeName . '.views.\1.\2', $viewThemed);
|
||||
|
||||
if (file_exists(Yii::getPathOfAlias($viewThemed) . ".php")) {
|
||||
$viewPath = Yii::getPathOfAlias($viewThemed) . ".php";
|
||||
}
|
||||
}
|
||||
|
||||
// Use orginal view name, if not set yet
|
||||
if ($viewPath == "") {
|
||||
$viewPath = Yii::getPathOfAlias($this->view) . ".php";
|
||||
}
|
||||
|
||||
$body = $controller->renderInternal($viewPath, array_merge($body, array('mail' => $this)), true);
|
||||
}
|
||||
return $this->message->setBody($body, $contentType, $charset);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
140
protected/components/HPhpMessageSource.php
Normal file
@ -0,0 +1,140 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HPhpMessageSource is a changed version of CPhpMessageSource class.
|
||||
*
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HPhpMessageSource extends CPhpMessageSource {
|
||||
|
||||
const CACHE_KEY_PREFIX = 'Yii.CPhpMessageSource.';
|
||||
|
||||
/**
|
||||
* @var integer the time in seconds that the messages can remain valid in cache.
|
||||
* Defaults to 0, meaning the caching is disabled.
|
||||
*/
|
||||
public $cachingDuration = 0;
|
||||
|
||||
/**
|
||||
* @var string the ID of the cache application component that is used to cache the messages.
|
||||
* Defaults to 'cache' which refers to the primary cache application component.
|
||||
* Set this property to false if you want to disable caching the messages.
|
||||
*/
|
||||
public $cacheID = 'cache';
|
||||
|
||||
/**
|
||||
* @var string the base path for all translated messages. Defaults to null, meaning
|
||||
* the "messages" subdirectory of the application directory (e.g. "protected/messages").
|
||||
*/
|
||||
public $basePath;
|
||||
|
||||
/**
|
||||
* @var array the message paths for extensions that do not have a base class to use as category prefix.
|
||||
* The format of the array should be:
|
||||
* <pre>
|
||||
* array(
|
||||
* 'ExtensionName' => 'ext.ExtensionName.messages',
|
||||
* )
|
||||
* </pre>
|
||||
* Where the key is the name of the extension and the value is the alias to the path
|
||||
* of the "messages" subdirectory of the extension.
|
||||
* When using Yii::t() to translate an extension message, the category name should be
|
||||
* set as 'ExtensionName.categoryName'.
|
||||
* Defaults to an empty array, meaning no extensions registered.
|
||||
* @since 1.1.13
|
||||
*/
|
||||
public $extensionPaths = array();
|
||||
private $_files = array();
|
||||
|
||||
/**
|
||||
* Initializes the application component.
|
||||
* This method overrides the parent implementation by preprocessing
|
||||
* the user request data.
|
||||
*/
|
||||
public function init() {
|
||||
parent::init();
|
||||
if ($this->basePath === null)
|
||||
$this->basePath = Yii::getPathOfAlias('application.messages');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines the message file name based on the given category and language.
|
||||
* If the category name contains a dot, it will be split into the module class name and the category name.
|
||||
* In this case, the message file will be assumed to be located within the 'messages' subdirectory of
|
||||
* the directory containing the module class file.
|
||||
* Otherwise, the message file is assumed to be under the {@link basePath}.
|
||||
* @param string $category category name
|
||||
* @param string $language language ID
|
||||
* @return string the message file path
|
||||
*/
|
||||
protected function getMessageFile($category, $language) {
|
||||
if (!isset($this->_files[$category][$language])) {
|
||||
if (($pos = strpos($category, '.')) !== false) {
|
||||
$extensionClass = substr($category, 0, $pos);
|
||||
$extensionCategory = substr($category, $pos + 1);
|
||||
// First check if there's an extension registered for this class.
|
||||
if (isset($this->extensionPaths[$extensionClass]))
|
||||
$this->_files[$category][$language] = Yii::getPathOfAlias($this->extensionPaths[$extensionClass]) . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $extensionCategory . '.php';
|
||||
else {
|
||||
// No extension registered, need to find it.
|
||||
try {
|
||||
$class = new ReflectionClass($extensionClass);
|
||||
$this->_files[$category][$language] = dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'messages' . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $extensionCategory . '.php';
|
||||
} catch (Exception $e) {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
} else
|
||||
$this->_files[$category][$language] = $this->basePath . DIRECTORY_SEPARATOR . $language . DIRECTORY_SEPARATOR . $category . '.php';
|
||||
}
|
||||
return $this->_files[$category][$language];
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the message translation for the specified language and category.
|
||||
* @param string $category the message category
|
||||
* @param string $language the target language
|
||||
* @return array the loaded messages
|
||||
*/
|
||||
protected function loadMessages($category, $language) {
|
||||
$messageFile = $this->getMessageFile($category, $language);
|
||||
|
||||
if ($this->cachingDuration > 0 && $this->cacheID !== false && ($cache = Yii::app()->getComponent($this->cacheID)) !== null) {
|
||||
$key = self::CACHE_KEY_PREFIX . $messageFile;
|
||||
if (($data = $cache->get($key)) !== false)
|
||||
return unserialize($data);
|
||||
}
|
||||
|
||||
if (is_file($messageFile)) {
|
||||
$messages = include($messageFile);
|
||||
if (!is_array($messages))
|
||||
$messages = array();
|
||||
if (isset($cache)) {
|
||||
$dependency = new CFileCacheDependency($messageFile);
|
||||
$cache->set($key, serialize($messages), $this->cachingDuration, $dependency);
|
||||
}
|
||||
return $messages;
|
||||
} else
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
69
protected/components/HTheme.php
Normal file
@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HTheme is an overwrite of CTheme
|
||||
*
|
||||
* This is caused by our view path for modules is also separeted into modules/ folders.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HTheme extends CTheme {
|
||||
/**
|
||||
* Finds the view file for the specified controller's view.
|
||||
*
|
||||
* @param CController $controller the controller
|
||||
* @param string $viewName the view name
|
||||
* @return string the view file path. False if the file does not exist.
|
||||
*/
|
||||
/*
|
||||
public function getViewFile($controller, $viewName) {
|
||||
$moduleViewPath = $this->getViewPath();
|
||||
if (($module = $controller->getModule()) !== null) {
|
||||
$moduleViewPath.='/modules/' . $module->getId();
|
||||
# ^^^^^^ added modules here
|
||||
}
|
||||
return $controller->resolveViewFile($viewName, $this->getViewPath() . '/' . $controller->getUniqueId(), $this->getViewPath(), $moduleViewPath);
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns an array of all installed themes.
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function getThemes() {
|
||||
$themes = array();
|
||||
$themePath = Yii::getPathOfAlias('webroot') . DIRECTORY_SEPARATOR . "themes";
|
||||
|
||||
foreach (scandir($themePath) as $file) {
|
||||
if ($file == "." || $file == ".." || !is_dir($themePath . DIRECTORY_SEPARATOR . $file)) {
|
||||
continue;
|
||||
}
|
||||
$themes[$file] = $file;
|
||||
}
|
||||
return $themes;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
150
protected/components/HWidget.php
Normal file
@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* HWidget is the base class for all widgets.
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class HWidget extends CWidget {
|
||||
|
||||
/**
|
||||
* @var array view paths for different types of widgets
|
||||
*/
|
||||
private static $_viewPaths;
|
||||
|
||||
/**
|
||||
* Returns the view path for this widget.
|
||||
*
|
||||
* Transform:
|
||||
* /protected/modules/moduleId/widgets/views/ to /themes/mytheme/views/moduleId/widgets
|
||||
* /protected/widgets/views/ to /themes/mytheme/views/widgets
|
||||
*
|
||||
* Instead of normal yii behavior:
|
||||
* /themes/myTheme/WidgetClass/..
|
||||
*
|
||||
* @param type $checkTheme
|
||||
* @return String
|
||||
*/
|
||||
public function getViewPath($checkTheme = false) {
|
||||
|
||||
// Fastlane
|
||||
$className = get_class($this);
|
||||
if (isset(self::$_viewPaths[$className]))
|
||||
return self::$_viewPaths[$className];
|
||||
|
||||
if ($checkTheme && ($theme = Yii::app()->getTheme()) !== null) {
|
||||
// /themes/myTheme/views/
|
||||
$path = $theme->getViewPath() . DIRECTORY_SEPARATOR;
|
||||
|
||||
// + moduleId/ - if exists
|
||||
$moduleId = $this->getModuleId();
|
||||
if ($moduleId)
|
||||
$path .= $moduleId . DIRECTORY_SEPARATOR;
|
||||
|
||||
$path .= 'widgets' . DIRECTORY_SEPARATOR;
|
||||
|
||||
if (is_dir($path))
|
||||
return self::$_viewPaths[$className] = $path;
|
||||
}
|
||||
|
||||
$class = new ReflectionClass($className);
|
||||
return self::$_viewPaths[$className] = dirname($class->getFileName()) . DIRECTORY_SEPARATOR . 'views';
|
||||
}
|
||||
|
||||
/**
|
||||
* Extends CWidgets getViewFile by possibilty to get also themed version
|
||||
* of a dotted view Filename
|
||||
*
|
||||
* @param string $viewName name of the view (without file extension)
|
||||
* @return string the view file path. False if the view file does not exist
|
||||
* @see CApplication::findLocalizedFile
|
||||
*/
|
||||
public function getViewFile($viewName) {
|
||||
|
||||
// a path alias e.g. application.modules.x.y.z.
|
||||
if (strpos($viewName, '.')) {
|
||||
|
||||
|
||||
if (($theme = Yii::app()->getTheme()) !== null) {
|
||||
// Replace application.modules[_core].MODULEID.widgets.views
|
||||
// in
|
||||
// webroot.themes.CURRENTTHEME.views.MODULEID.widgets
|
||||
$viewNameTheme = $viewName;
|
||||
$viewNameTheme = str_replace('application.views.', 'webroot.themes.' . $theme->getName() . '.views.', $viewNameTheme);
|
||||
$viewNameTheme = preg_replace('/application\.modules(?:_core)?\.(.*?)\.views\.(.*)/i', 'webroot.themes.' . $theme->getName() . '.views.\1.\2', $viewNameTheme);
|
||||
#$viewNameTheme = preg_replace('/widgets\.views/', 'widgets', $viewNameTheme);
|
||||
|
||||
$viewFile = Yii::getPathOfAlias($viewNameTheme);
|
||||
|
||||
// Check if File exists
|
||||
if (is_file($viewFile . '.php')) {
|
||||
return Yii::app()->findLocalizedFile($viewFile . '.php');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Fall Back to default
|
||||
}
|
||||
return parent::getViewFile($viewName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the parent moduleId if can determined.
|
||||
* This requires that the module is located under /modules/ or /modules_core/.
|
||||
*
|
||||
* It doesn´t support nested modules.
|
||||
* Always the parent moduleId is returned.
|
||||
*
|
||||
* @return String The Id of Module
|
||||
*/
|
||||
public function getModuleId() {
|
||||
|
||||
// Get Directory of current widget class
|
||||
$reflector = new ReflectionClass(get_class($this));
|
||||
$fileName = $reflector->getFileName();
|
||||
|
||||
// Search for .../modules_core/FINDME/... or .../modules/FINDME/...
|
||||
preg_match('/\/modules(?:_core)?\/(.*?)\//', $fileName, $match);
|
||||
|
||||
if (isset($match[1]))
|
||||
return $match[1];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the createUrl functionality to widget by passing it to the current
|
||||
* controller.
|
||||
*
|
||||
* @param String $action
|
||||
* @param Array $params
|
||||
* @param String $ampersand
|
||||
* @return String url
|
||||
*/
|
||||
public function createUrl($action, $params = array(), $ampersand = '&') {
|
||||
return $this->getController()->createUrl($this->actionPrefix . $action, $params, $ampersand);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
411
protected/components/ModuleManager.php
Normal file
@ -0,0 +1,411 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* ModuleManager allows dynamic enabling/disabling of application modules.
|
||||
*
|
||||
* Each module has a autostart.php which can register the module.
|
||||
*
|
||||
* Modules must register with a module definition, which holds all relevant
|
||||
* information about it.
|
||||
*
|
||||
* Module Definition Array:
|
||||
* id => mymodule (also folder name under /modules/...)
|
||||
* title => My Module
|
||||
* icon => cssClass
|
||||
* description => someText (For Admin Manage Modules)
|
||||
* isSpaceModule => true/FALSE (Is a workspace module)
|
||||
* isCoreModule => true/FALSE (Is core module, always enabled)
|
||||
* configRoute => 'mymodule/configure' (Configuration URL for SuperAdmin)
|
||||
*
|
||||
* @todo cache enabled modules - problem module manager started before caching
|
||||
*
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class ModuleManager extends CApplicationComponent {
|
||||
|
||||
const AUTOSTART_CACHE_FILE_NAME = "cache_autostart.php";
|
||||
|
||||
/**
|
||||
* @var Array of all registered module definitions
|
||||
*/
|
||||
public $registeredModules;
|
||||
|
||||
/**
|
||||
* @var Array of enabled module ids.
|
||||
*/
|
||||
public $enabledModules;
|
||||
|
||||
/**
|
||||
* @var Array of registered content model classes.
|
||||
*/
|
||||
public $registeredContentModels = array();
|
||||
|
||||
/**
|
||||
* Initializes the application component.
|
||||
* This should also should check which module is enabled
|
||||
*/
|
||||
public function init() {
|
||||
|
||||
parent::init();
|
||||
|
||||
if (Yii::app()->params['installed'])
|
||||
$this->loadEnabledModules();
|
||||
|
||||
// Intercept this controller
|
||||
Yii::app()->interceptor->intercept($this);
|
||||
}
|
||||
|
||||
public function start() {
|
||||
|
||||
$this->executeAutoloaders();
|
||||
#print "start";
|
||||
#die();
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches and executes all module autoloaders.
|
||||
*
|
||||
* The module autoloaders are stored in a file "autostart.php" which can be
|
||||
* placed in the root directory of the module.
|
||||
*
|
||||
* @todo Caching autostarts
|
||||
* @todo Remove rendundant code
|
||||
*/
|
||||
private function executeAutoloaders() {
|
||||
|
||||
$cacheFileName = Yii::app()->getRuntimePath() . DIRECTORY_SEPARATOR . self::AUTOSTART_CACHE_FILE_NAME;
|
||||
if (file_exists($cacheFileName)) {
|
||||
require_once($cacheFileName);
|
||||
return;
|
||||
}
|
||||
|
||||
$fileNames = array();
|
||||
|
||||
// Looking up 3rd party modules
|
||||
$modulesPaths = array(Yii::app()->getBasePath() . DIRECTORY_SEPARATOR . 'modules', Yii::app()->getBasePath() . DIRECTORY_SEPARATOR . 'modules_core');
|
||||
|
||||
// Execute Autoloaders in each modules paths
|
||||
foreach ($modulesPaths as $modulesPath) {
|
||||
|
||||
// Scan Modules
|
||||
$modules = scandir($modulesPath);
|
||||
foreach ($modules as $module) {
|
||||
if ($module == '.' || $module == '..')
|
||||
continue;
|
||||
|
||||
$moduleDir = $modulesPath . DIRECTORY_SEPARATOR . $module . DIRECTORY_SEPARATOR;
|
||||
|
||||
if (is_dir($moduleDir) && is_file($moduleDir . 'autostart.php')) {
|
||||
|
||||
// Store Filename to Cache Content
|
||||
$fileNames[] = $moduleDir . 'autostart.php';
|
||||
|
||||
// Execute Autoloader
|
||||
require_once($moduleDir . 'autostart.php');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Created a file which contains all autoloaders
|
||||
$content = "";
|
||||
foreach ($fileNames as $fileName) {
|
||||
$content .= file_get_contents($fileName);
|
||||
}
|
||||
file_put_contents($cacheFileName, $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads all enabled modules from the database. (Cached)
|
||||
*/
|
||||
private function loadEnabledModules() {
|
||||
|
||||
$cacheId = "enabledModules";
|
||||
$cacheValue = Yii::app()->cache->get($cacheId);
|
||||
|
||||
if ($cacheValue === false || !is_array($cacheValue)) {
|
||||
|
||||
$enabledModules = array();
|
||||
foreach (ModuleEnabled::model()->findAll() as $em) {
|
||||
$enabledModules[$em->module_id] = $em->module_id;
|
||||
}
|
||||
Yii::app()->cache->set($cacheId, $enabledModules, HSetting::Get('expireTime', 'cache'));
|
||||
$this->enabledModules = $enabledModules;
|
||||
} else {
|
||||
$this->enabledModules = $cacheValue;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Flushes Module Managers cache
|
||||
*/
|
||||
public function flushCache() {
|
||||
|
||||
// Autoloader Cache File
|
||||
$cacheFileName = Yii::app()->getRuntimePath() . DIRECTORY_SEPARATOR . self::AUTOSTART_CACHE_FILE_NAME;
|
||||
if (file_exists($cacheFileName)) {
|
||||
unlink($cacheFileName);
|
||||
}
|
||||
|
||||
$cacheId = "enabledModules";
|
||||
Yii::app()->cache->delete($cacheId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a module
|
||||
* This is usally called in the autostart file of the module.
|
||||
*
|
||||
* @param Array $definition
|
||||
*/
|
||||
public function register($definition) {
|
||||
$id = $definition['id'];
|
||||
|
||||
if (!isset($definition['isSpaceModule']))
|
||||
$definition['isSpaceModule'] = false;
|
||||
|
||||
if (!isset($definition['isCoreModule']))
|
||||
$definition['isCoreModule'] = false;
|
||||
|
||||
if (!isset($definition['configRoute']))
|
||||
$definition['configRoute'] = '';
|
||||
|
||||
if (!isset($definition['spaceConfigRoute']))
|
||||
$definition['spaceConfigRoute'] = '';
|
||||
|
||||
|
||||
$this->registeredModules[$id] = $definition;
|
||||
|
||||
// Check if module is enabled
|
||||
if (Yii::app()->moduleManager->isEnabled($id)) {
|
||||
|
||||
// Register Yii Module
|
||||
if (isset($definition['class'])) {
|
||||
Yii::app()->setModules(array(
|
||||
$id => array(
|
||||
'class' => $definition['class']
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
// Set Imports
|
||||
if (isset($definition['import'])) {
|
||||
Yii::app()->setImport($definition['import']);
|
||||
}
|
||||
|
||||
// Register Event Handlers
|
||||
if (isset($definition['events'])) {
|
||||
foreach ($definition['events'] as $event) {
|
||||
Yii::app()->interceptor->attachEventHandler(
|
||||
$event['class'], $event['event'], $event['callback']
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a module is enabled or not.
|
||||
*
|
||||
* @param type $moduleId
|
||||
* @return boolean
|
||||
*/
|
||||
public function isEnabled($moduleId) {
|
||||
|
||||
$definition = $this->getDefinition($moduleId);
|
||||
|
||||
if ($definition['isCoreModule'])
|
||||
return true;
|
||||
|
||||
// Core installed yet?
|
||||
if (!Yii::app()->params['installed'])
|
||||
return false;
|
||||
|
||||
if (in_array($moduleId, $this->enabledModules)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
#$moduleEnabled = ModuleEnabled::model()->findByPk($moduleId);
|
||||
#if ($moduleEnabled != null) {
|
||||
# return true;
|
||||
#}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array with all registered modules
|
||||
* This contains all enabled & disabled modules.
|
||||
* Key is the moduleId and value is the module definition
|
||||
*
|
||||
* @return type
|
||||
*/
|
||||
public function getRegisteredModules() {
|
||||
return $this->registeredModules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array with enabled modules
|
||||
* Key of the array is the module id and value is the module definition.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function getEnabledModules() {
|
||||
|
||||
$enabledModules = array();
|
||||
|
||||
foreach ($this->getRegisteredModules() as $moduleId => $definition) {
|
||||
if ($this->isEnabled($moduleId)) {
|
||||
$enabledModules[$moduleId] = $definition;
|
||||
}
|
||||
}
|
||||
|
||||
return $enabledModules;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables a module by given module id.
|
||||
*
|
||||
* @param String $id
|
||||
*/
|
||||
public function enable($id) {
|
||||
|
||||
$definition = $this->getDefinition($id);
|
||||
if ($definition != null) {
|
||||
|
||||
// Core Modules doesn´t need to enabled
|
||||
if (!$definition['isCoreModule']) {
|
||||
|
||||
$moduleEnabled = ModuleEnabled::model()->findByPk($id);
|
||||
if ($moduleEnabled == null) {
|
||||
$moduleEnabled = new ModuleEnabled();
|
||||
$moduleEnabled->module_id = $id;
|
||||
$moduleEnabled->save();
|
||||
|
||||
// Fire Event Disabled Event
|
||||
if ($this->hasEventHandler('onEnable'))
|
||||
$this->onEnable(new CEvent($this, $id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->flushCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables a active module by given module id
|
||||
*
|
||||
* @param String $id
|
||||
*/
|
||||
public function disable($id) {
|
||||
|
||||
$definition = $this->getDefinition($id);
|
||||
if ($definition != null) {
|
||||
|
||||
// Core Modules couldn´t disabled
|
||||
if (!$definition['isCoreModule']) {
|
||||
|
||||
if (isset($definition['userModules']) && is_array($definition['userModules'])) {
|
||||
$modulesToDisable = array_keys($definition['userModules']);
|
||||
foreach (User::model()->findAll() as $user) {
|
||||
foreach ($modulesToDisable as $userModuleId) {
|
||||
if ($user->isModuleEnabled($userModuleId))
|
||||
$user->uninstallModule($userModuleId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($definition['spaceModules']) && is_array($definition['spaceModules'])) {
|
||||
$modulesToDisable = array_keys($definition['spaceModules']);
|
||||
foreach (Space::model()->findAll() as $space) {
|
||||
foreach ($modulesToDisable as $spaceModuleId) {
|
||||
if ($space->isModuleEnabled($spaceModuleId))
|
||||
$space->uninstallModule($spaceModuleId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get Enabled Module Record
|
||||
$moduleEnabled = ModuleEnabled::model()->findByPk($id);
|
||||
if ($moduleEnabled != null)
|
||||
$moduleEnabled->delete();
|
||||
|
||||
// Fire Event Disabled Event
|
||||
if ($this->hasEventHandler('onDisable'))
|
||||
$this->onDisable(new CEvent($this, $id));
|
||||
}
|
||||
}
|
||||
$this->flushCache();
|
||||
}
|
||||
|
||||
/**
|
||||
* This event is raised after disabling a module
|
||||
*
|
||||
* @param CEvent $event the event parameter
|
||||
* @see disable
|
||||
*/
|
||||
public function onDisable($event) {
|
||||
$this->raiseEvent('onDisable', $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* This event is raised after enabling a module
|
||||
*
|
||||
* @param CEvent $event the event parameter
|
||||
* @see enable
|
||||
*/
|
||||
public function onEnable($event) {
|
||||
$this->raiseEvent('onEnable', $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the definition array of a registered module
|
||||
*
|
||||
* @param type $id
|
||||
* @return null
|
||||
*/
|
||||
public function getDefinition($id) {
|
||||
if (isset($this->registeredModules[$id]))
|
||||
return $this->registeredModules[$id];
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a new Content Model
|
||||
*
|
||||
* @param String $className
|
||||
*/
|
||||
public function registerContentModel($className) {
|
||||
$this->registeredContentModels[] = $className;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of all registered content models
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public function getContentModels() {
|
||||
return $this->registeredContentModels;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
77
protected/components/WebApplication.php
Normal file
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* WebApplication is the base WebApplication class
|
||||
*
|
||||
* @author Lucas Bartholemy <lucas@bartholemy.com>
|
||||
* @package humhub.components
|
||||
* @since 0.5
|
||||
*/
|
||||
class WebApplication extends CWebApplication {
|
||||
|
||||
/**
|
||||
* Inits the webapplication
|
||||
*
|
||||
* Also start interceptor to add event support
|
||||
*/
|
||||
protected function init() {
|
||||
|
||||
parent::init();
|
||||
|
||||
$this->interceptor->start();
|
||||
$this->interceptor->intercept($this);
|
||||
|
||||
$this->moduleManager->start();
|
||||
|
||||
if ($this->hasEventHandler('onInit'))
|
||||
$this->onInit(new CEvent($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* This event is raised after the init is executed.
|
||||
* @param CEvent $event the event parameter
|
||||
*/
|
||||
public function onInit($event) {
|
||||
$this->raiseEvent('onInit', $event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of available language codes
|
||||
*
|
||||
* @return Array
|
||||
*/
|
||||
public static function getLanguages() {
|
||||
|
||||
$languages = array();
|
||||
$languages['en'] = 'en';
|
||||
|
||||
$files = scandir(Yii::app()->basePath . '/messages');
|
||||
foreach ($files as $file) {
|
||||
if ($file == '.' || $file == '..')
|
||||
continue;
|
||||
$languages[$file] = $file;
|
||||
}
|
||||
return $languages;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
81
protected/config/_defaults.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
return array(
|
||||
'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..',
|
||||
// Default Application Name
|
||||
'name' => 'HumHub',
|
||||
'preload' => array('log', 'input'),
|
||||
'components' => array(
|
||||
// Database
|
||||
'db' => array(
|
||||
'connectionString' => 'mysql:host=localhost;dbname=test',
|
||||
'emulatePrepare' => true,
|
||||
'charset' => 'utf8',
|
||||
'enableProfiling' => true,
|
||||
'enableParamLogging' => true,
|
||||
'schemaCachingDuration' => 3600,
|
||||
),
|
||||
'moduleManager' => array(
|
||||
'class' => 'application.components.ModuleManager',
|
||||
),
|
||||
'messages' => array(
|
||||
'class' => 'application.components.HPhpMessageSource',
|
||||
),
|
||||
'input' => array(
|
||||
'class' => 'application.extensions.CmsInput',
|
||||
'cleanPost' => false,
|
||||
'cleanGet' => false,
|
||||
),
|
||||
'interceptor' => array(
|
||||
'class' => 'HInterceptor',
|
||||
),
|
||||
'session' => array(
|
||||
'class' => 'application.modules_core.user.components.SIHttpSession',
|
||||
'connectionID' => 'db',
|
||||
'sessionName' => 'sin',
|
||||
),
|
||||
'request' => array(
|
||||
//'enableCsrfValidation' => true,
|
||||
),
|
||||
// Caching (Will replaced at runtime)
|
||||
'cache' => array(
|
||||
'class' => 'CDummyCache'
|
||||
),
|
||||
),
|
||||
// Modules
|
||||
'modules' => array(
|
||||
// All HumHub Modules will automatically loaded via
|
||||
// /modules/*/autostart.php
|
||||
// or
|
||||
// /modules_core/*/autostart.php
|
||||
),
|
||||
// autoloading model and component classes
|
||||
'import' => array(
|
||||
'application.models.*',
|
||||
'application.forms.*',
|
||||
'application.components.*',
|
||||
'application.behaviors.*',
|
||||
'application.interfaces.*',
|
||||
'application.libs.*',
|
||||
'application.widgets.*',
|
||||
// 3rd Party Extensions
|
||||
'ext.yii-mail.YiiMailMessage',
|
||||
'ext.EZendAutoloader.EZendAutoloader',
|
||||
),
|
||||
// application-level parameters that can be accessed
|
||||
// using Yii::app()->params['paramName']
|
||||
'params' => array(
|
||||
// Installed Flag
|
||||
'installed' => false,
|
||||
// Authentication Options
|
||||
'auth' => array(
|
||||
// Available Registration Types
|
||||
'modes' => array('local'),
|
||||
// Local Authentication Options
|
||||
'local' => array(
|
||||
'freeRegistration' => true,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
?>
|
3
protected/config/_settings.php
Normal file
@ -0,0 +1,3 @@
|
||||
<?php return array (
|
||||
|
||||
); ?>
|
66
protected/config/console.php
Normal file
@ -0,0 +1,66 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Console Default Configuration
|
||||
*
|
||||
* This configuration file only affects only the console application.
|
||||
*/
|
||||
$pre_config = CMap::mergeArray(require (dirname(__FILE__) . '/_defaults.php'), require (dirname(__FILE__) . '/_settings.php'));
|
||||
return CMap::mergeArray($pre_config, array(
|
||||
'preload' => array('log'),
|
||||
'behaviors' => array(
|
||||
'viewRenderer' => 'HConsoleApplicationBehavior',
|
||||
),
|
||||
'components' => array(
|
||||
'urlManager' => array(
|
||||
'urlFormat' => 'path',
|
||||
'showScriptName' => false,
|
||||
'rules' => array(
|
||||
'<controller:\w+>/<id:\d+>' => '<controller>/view',
|
||||
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
|
||||
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
|
||||
),
|
||||
),
|
||||
'request' => array(
|
||||
'class' => 'HHttpRequest',
|
||||
),
|
||||
'user' => array(
|
||||
'class' => 'ConsoleUser',
|
||||
),
|
||||
'log' => array(
|
||||
'class' => 'CLogRouter',
|
||||
'routes' => array(
|
||||
array(
|
||||
'class' => 'CFileLogRoute',
|
||||
'levels' => 'error, warning',
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
// autoloading model and component classes
|
||||
'import' => array(
|
||||
'application.models.*',
|
||||
'application.forms.*',
|
||||
'application.components.*',
|
||||
'application.vendors.yii.cli.commands.*',
|
||||
'application.libs.*',
|
||||
'application.modules_core.user.components.*',
|
||||
'ext.EZendAutoloader.EZendAutoloader',
|
||||
'ext.migrate-command.*',
|
||||
),
|
||||
'commandMap' => array(
|
||||
'message' => 'application.commands.shell.ZMessageCommand',
|
||||
'search_rebuild' => 'application.commands.shell.SearchIndexer.Rebuilder',
|
||||
'search_optimize' => 'application.commands.shell.SearchIndexer.Optimize',
|
||||
'integritychecker' => 'application.commands.shell.Maintain.IntegrityChecker',
|
||||
'search' => 'application.modules.zstunden.commands.Search',
|
||||
'emailing' => 'application.commands.shell.EMailing.EMailing',
|
||||
'emailing_test' => 'application.commands.shell.EMailing.TestMail',
|
||||
'cron' => 'application.commands.shell.ZCron.ZCronRunner',
|
||||
'migrate' => array(
|
||||
'class' => 'application.commands.shell.ZMigrateCommand',
|
||||
'migrationPath' => 'application.migrations',
|
||||
'migrationTable' => 'migration',
|
||||
),
|
||||
),
|
||||
));
|
46
protected/config/htmlpurifier.php
Normal file
@ -0,0 +1,46 @@
|
||||
<?php if ( ! defined('YII_PATH')) exit('No direct script access allowed');
|
||||
|
||||
return array(
|
||||
|
||||
/*'Attr.AllowedRel' => array('noindex','nofollow'),
|
||||
'Attr.DefaultImageAlt' => NULL,
|
||||
'Core.ColorKeywords' => array(
|
||||
'maroon' => '#800000',
|
||||
'red' => '#FF0000',
|
||||
'orange' => '#FFA500',
|
||||
'yellow' => '#FFFF00',
|
||||
'olive' => '#808000',
|
||||
'purple' => '#800080',
|
||||
'fuchsia' => '#FF00FF',
|
||||
'white' => '#FFFFFF',
|
||||
'lime' => '#00FF00',
|
||||
'green' => '#008000',
|
||||
'navy' => '#000080',
|
||||
'blue' => '#0000FF',
|
||||
'aqua' => '#00FFFF',
|
||||
'teal' => '#008080',
|
||||
'black' => '#000000',
|
||||
'silver' => '#C0C0C0',
|
||||
'gray' => '#808080',
|
||||
),
|
||||
'Core.Encoding' => Yii::app()->charset,
|
||||
'Core.EscapeInvalidTags' => FALSE,
|
||||
'HTML.AllowedElements' => array(
|
||||
'a','b','em','small','strong','del','q','img','span','ul','ol','li','h1','h2','h3','h4','h5','h6'
|
||||
),
|
||||
'HTML.AllowedAttributes' => array(
|
||||
'href','rel','target','src', 'style',
|
||||
),
|
||||
*/
|
||||
'HTML.Doctype' => 'XHTML 1.0 Transitional',
|
||||
'URI.AllowedSchemes' => array(
|
||||
'http' => true,
|
||||
'https' => true,
|
||||
'mailto' => true,
|
||||
'ftp' => true,
|
||||
'nntp' => true,
|
||||
'news' => true,
|
||||
),
|
||||
'URI.Base'=>NULL,
|
||||
|
||||
);
|
27
protected/config/i18n.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* This is the configuration for generating message translations
|
||||
* for the Yii framework. It is used by the 'yiic message' command.
|
||||
*/
|
||||
return array(
|
||||
//'sourcePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'../..',
|
||||
'sourcePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..',
|
||||
|
||||
'messagePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'messages',
|
||||
//'languages'=>array('fi','zh_cn','zh_tw','de','de_du','1337', 'el','es','sv','he','nl','pt','pt_br','ru','it','fr','ja','pl','hu','ro','id','vi','bg','lv','sk','uk','ko_kr','kk','cs'),
|
||||
'languages'=>array('de','fr'),
|
||||
|
||||
'fileTypes'=>array('php'),
|
||||
'overwrite'=>true,
|
||||
'exclude'=>array(
|
||||
'.svn',
|
||||
'.gitignore',
|
||||
'yiilite.php',
|
||||
'yiit.php',
|
||||
'/i18n/data',
|
||||
'/messages',
|
||||
'/vendors',
|
||||
'/web/js',
|
||||
'yii',
|
||||
),
|
||||
);
|
61
protected/config/main.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Web Application Default Configuration
|
||||
*
|
||||
* This file not affects console applications!
|
||||
*/
|
||||
Yii::setPathOfAlias('modules_core', dirname(__FILE__) . '/../modules_core');
|
||||
|
||||
|
||||
$pre_config = CMap::mergeArray(require (dirname(__FILE__) . '/_defaults.php'), require (dirname(__FILE__) . '/_settings.php'));
|
||||
|
||||
return CMap::mergeArray($pre_config, array(
|
||||
// preloading 'log' component
|
||||
'preload' => array('log'),
|
||||
// application components
|
||||
'components' => array(
|
||||
// Session specific settings
|
||||
'session' => array(
|
||||
),
|
||||
'user' => array(
|
||||
// enable cookie-based authentication
|
||||
'allowAutoLogin' => true,
|
||||
'class' => 'application.modules_core.user.components.WebUser',
|
||||
'loginUrl' => array('//user/auth/login'),
|
||||
),
|
||||
'request' => array(
|
||||
'class' => 'HHttpRequest',
|
||||
'enableCsrfValidation' => true,
|
||||
),
|
||||
'clientScript' => array(
|
||||
'class' => 'HClientScript',
|
||||
),
|
||||
// uncomment the following to enable URLs in path-format
|
||||
'urlManager' => array(
|
||||
'urlFormat' => 'path',
|
||||
'showScriptName' => false,
|
||||
'rules' => array(
|
||||
'<controller:\w+>/<id:\d+>' => '<controller>/view',
|
||||
'<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',
|
||||
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
|
||||
),
|
||||
),
|
||||
'themeManager' => array(
|
||||
'themeClass' => 'HTheme',
|
||||
),
|
||||
'errorHandler' => array(
|
||||
// use 'site/error' action to display errors
|
||||
'errorAction' => '//site/error',
|
||||
),
|
||||
'log' => array(
|
||||
'class' => 'CLogRouter',
|
||||
'routes' => array(
|
||||
array(
|
||||
'class' => 'CFileLogRoute',
|
||||
'levels' => 'error, warning',
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
));
|
182
protected/controllers/DashboardController.php
Normal file
@ -0,0 +1,182 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Dashboard Controller
|
||||
*
|
||||
* @package humhub.controllers
|
||||
* @since 0.5
|
||||
*/
|
||||
class DashboardController extends Controller {
|
||||
|
||||
/**
|
||||
* @return array action filters
|
||||
*/
|
||||
public function filters() {
|
||||
return array(
|
||||
'accessControl', // perform access control for CRUD operations
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies the access control rules.
|
||||
* This method is used by the 'accessControl' filter.
|
||||
* @return array access control rules
|
||||
*/
|
||||
public function accessRules() {
|
||||
return array(
|
||||
array('allow', // allow authenticated user to perform 'create' and 'update' actions
|
||||
'users' => array('@'),
|
||||
),
|
||||
array('deny', // deny all users
|
||||
'users' => array('*'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dashboard Index
|
||||
*
|
||||
* Show recent wall entries for this user
|
||||
*/
|
||||
public function actionIndex() {
|
||||
|
||||
// contains the current version to show the welcome modal
|
||||
$version = 1;
|
||||
|
||||
Yii::app()->user->model->checkWall();
|
||||
|
||||
//$mySpaces = Yii::app()->user->getModel()->getSpaces();
|
||||
//$this->render('index', array('mySpaces' => $mySpaces));
|
||||
$this->render('index', array('version' => $version));
|
||||
}
|
||||
|
||||
/**
|
||||
* Page which shows all current workspaces
|
||||
*/
|
||||
public function actionSpaces() {
|
||||
|
||||
$pageSize = 5;
|
||||
|
||||
$criteria = new CDbCriteria();
|
||||
$criteria->condition = 'visibility != ' . Space::VISIBILITY_NONE;
|
||||
$criteria->order = 'id DESC';
|
||||
//$criteria->params = array (':id'=>$id);
|
||||
|
||||
$workspaceCount = Space::model()->count($criteria);
|
||||
|
||||
$pages = new CPagination($workspaceCount);
|
||||
$pages->setPageSize($pageSize);
|
||||
$pages->applyLimit($criteria); // the trick is here!
|
||||
|
||||
$workspaces = Space::model()->findAll($criteria);
|
||||
|
||||
$this->render('workspaces', array(
|
||||
'workspaces' => $workspaces,
|
||||
'pages' => $pages,
|
||||
'workspaceCount' => $workspaceCount,
|
||||
'pageSize' => $pageSize,
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Page which shows all people
|
||||
*/
|
||||
public function actionPeople() {
|
||||
|
||||
$criteria = new CDbCriteria();
|
||||
//$criteria->condition = 'visibility != '.Space::VISIBILITY_NONE;
|
||||
$criteria->order = 'firstname ASC';
|
||||
|
||||
$userCount = User::model()->count($criteria);
|
||||
|
||||
$pages = new CPagination($userCount);
|
||||
$pages->setPageSize(HSetting::Get('paginationSize'));
|
||||
$pages->applyLimit($criteria); // the trick is here!
|
||||
|
||||
$users = User::model()->findAll($criteria);
|
||||
|
||||
$this->render('people', array(
|
||||
'users' => $users,
|
||||
'pages' => $pages,
|
||||
'userCount' => $userCount,
|
||||
'pageSize' => HSetting::Get('paginationSize'),
|
||||
));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a JSON Object which contains a lot of informations about
|
||||
* current states like new posts on workspaces
|
||||
*/
|
||||
public function actionGetFrontEndInfo() {
|
||||
|
||||
$json = array();
|
||||
$json['workspaces'] = array();
|
||||
|
||||
$criteria = new CDbCriteria();
|
||||
$criteria->order = 'last_visit DESC';
|
||||
|
||||
$memberships = UserSpaceMembership::model()->with('workspace')->findAllByAttributes(array(
|
||||
'user_id' => Yii::app()->user->id,
|
||||
'status' => UserSpaceMembership::STATUS_MEMBER
|
||||
), $criteria);
|
||||
|
||||
foreach ($memberships as $membership) {
|
||||
$workspace = $membership->workspace;
|
||||
|
||||
$info = array();
|
||||
$info['name'] = $workspace->name;
|
||||
#$info['id'] = $workspace->id; # should be hidden at frontend
|
||||
$info['guid'] = $workspace->guid;
|
||||
$info['totalItems'] = $workspace->countItems();
|
||||
$info['newItems'] = $membership->countNewItems();
|
||||
|
||||
$json['workspaces'][] = $info;
|
||||
}
|
||||
|
||||
if (Yii::app()->moduleManager->isEnabled('mail')) {
|
||||
// New message count
|
||||
$sql = "SELECT count(message_id)
|
||||
FROM user_message
|
||||
LEFT JOIN message on message.id = user_message.message_id
|
||||
WHERE user_message.user_id = :user_id AND (message.updated_at > user_message.last_viewed OR user_message.last_viewed IS NULL)";
|
||||
$connection = Yii::app()->db;
|
||||
$command = $connection->createCommand($sql);
|
||||
$userId = Yii::app()->user->id;
|
||||
$command->bindParam(":user_id", $userId);
|
||||
$json['newMessages'] = $command->queryScalar();
|
||||
}
|
||||
|
||||
|
||||
// New notification count
|
||||
$sql = "SELECT count(id)
|
||||
FROM notification
|
||||
WHERE user_id = :user_id AND seen != 1";
|
||||
$connection = Yii::app()->db;
|
||||
$command = $connection->createCommand($sql);
|
||||
$userId = Yii::app()->user->id;
|
||||
$command->bindParam(":user_id", $userId);
|
||||
$json['newNotifications'] = $command->queryScalar();
|
||||
|
||||
print CJSON::encode($json);
|
||||
Yii::app()->end();
|
||||
}
|
||||
|
||||
}
|
156
protected/controllers/SearchController.php
Normal file
@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Search Controller provides search functions inside the application.
|
||||
*
|
||||
* @author Luke
|
||||
* @package humhub.controllers
|
||||
* @since 0.5
|
||||
*/
|
||||
class SearchController extends Controller {
|
||||
|
||||
public $subLayout = "_layout";
|
||||
|
||||
/**
|
||||
* @return array action filters
|
||||
*/
|
||||
public function filters() {
|
||||
return array(
|
||||
'accessControl', // perform access control for CRUD operations
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Specifies the access control rules.
|
||||
* This method is used by the 'accessControl' filter.
|
||||
* @return array access control rules
|
||||
*/
|
||||
public function accessRules() {
|
||||
return array(
|
||||
array('allow', // allow authenticated user to perform 'create' and 'update' actions
|
||||
'users' => array('@'),
|
||||
),
|
||||
array('deny', // deny all users
|
||||
'users' => array('*'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* SearchAction
|
||||
*
|
||||
* Modes: normal for full page, quick as partial for lightbox
|
||||
*/
|
||||
public function actionIndex() {
|
||||
|
||||
// Get Parameters
|
||||
$keyword = Yii::app()->request->getParam('keyword', "");
|
||||
$spaceGuid = Yii::app()->request->getParam('sguid', "");
|
||||
$mode = Yii::app()->request->getParam('mode', "normal");
|
||||
$page = (int) Yii::app()->request->getParam('page', 1); // current page (pagination)
|
||||
// Cleanup
|
||||
$keyword = Yii::app()->input->stripClean($keyword);
|
||||
$spaceGuid = Yii::app()->input->stripClean($spaceGuid);
|
||||
|
||||
if ($mode != 'quick') {
|
||||
$mode = "normal";
|
||||
}
|
||||
|
||||
$limit = HSetting::Get('paginationSize'); // Show Hits
|
||||
$hitCount = 0; // Total Hit Count
|
||||
$query = ""; // Lucene Query
|
||||
$append = " AND (model:User OR model:Space)"; // Appends for Lucene Query
|
||||
$moreResults = false; // Indicates if there are more hits
|
||||
$results = array();
|
||||
|
||||
// Quick Search shows always 1
|
||||
if ($mode == 'quick')
|
||||
$limit = 5;
|
||||
|
||||
// Load also Space if requested
|
||||
$currentSpace = null;
|
||||
if ($spaceGuid) {
|
||||
$currentSpace = Space::model()->findByAttributes(array('guid' => $spaceGuid));
|
||||
}
|
||||
|
||||
/*
|
||||
* $index = new Zend_Search_Lucene_Interface_MultiSearcher();
|
||||
* $index->addIndex(Zend_Search_Lucene::open('search/index1'));
|
||||
* $index->addIndex(Zend_Search_Lucene::open('search/index2'));
|
||||
* $index->find('someSearchQuery');
|
||||
*/
|
||||
|
||||
// Do Search
|
||||
if ($keyword != "") {
|
||||
|
||||
if ($currentSpace != null) {
|
||||
$append = " AND (model:User OR model:Space OR (belongsToType:Space AND belongsToId:" . $currentSpace->id . "))";
|
||||
}
|
||||
|
||||
$hits = new ArrayObject(HSearch::getInstance()->Find($keyword . $append));
|
||||
$hitCount = count($hits);
|
||||
|
||||
// Limit Hits
|
||||
$hits = new LimitIterator($hits->getIterator(), ($page - 1) * $limit, $limit);
|
||||
|
||||
if ($hitCount > $limit)
|
||||
$moreResults = true;
|
||||
|
||||
// Build Results Array
|
||||
|
||||
foreach ($hits as $hit) {
|
||||
|
||||
$doc = $hit->getDocument();
|
||||
$model = $doc->getField('model')->value;
|
||||
$pk = $doc->getField('pk')->value;
|
||||
|
||||
$object = $model::model()->findByPk($pk);
|
||||
$results[] = $object->getSearchResult();
|
||||
}
|
||||
}
|
||||
|
||||
// Create Pagination Class
|
||||
$pages = new CPagination($hitCount);
|
||||
$pages->setPageSize($limit);
|
||||
$_GET['keyword'] = $keyword; // Fix for post var
|
||||
|
||||
if ($mode == 'quick') {
|
||||
$this->renderPartial('quick', array(
|
||||
'keyword' => $keyword,
|
||||
'results' => $results,
|
||||
'spaceGuid' => $spaceGuid,
|
||||
'moreResults' => $moreResults,
|
||||
'hitCount' => $hitCount,
|
||||
));
|
||||
} else {
|
||||
$this->render('index', array(
|
||||
'keyword' => $keyword,
|
||||
'results' => $results,
|
||||
'spaceGuid' => $spaceGuid,
|
||||
'moreResults' => $moreResults,
|
||||
'pages' => $pages, // CPagination,
|
||||
'pageSize' => $limit,
|
||||
'hitCount' => $hitCount,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
50
protected/controllers/SiteController.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* HumHub
|
||||
* Copyright © 2014 The HumHub Project
|
||||
*
|
||||
* The texts of the GNU Affero General Public License with an additional
|
||||
* permission and of our proprietary license can be found at and
|
||||
* in the LICENSE file you have received along with this program.
|
||||
*
|
||||
* According to our dual licensing model, this program can be used either
|
||||
* under the terms of the GNU Affero General Public License, version 3,
|
||||
* or under a proprietary license.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Site Controller
|
||||
*
|
||||
* @package humhub.controllers
|
||||
* @since 0.5
|
||||
*/
|
||||
class SiteController extends Controller {
|
||||
|
||||
/**
|
||||
* This is the default 'index' action that is invoked
|
||||
* when an action is not explicitly requested by users.
|
||||
*/
|
||||
public function actionIndex() {
|
||||
|
||||
$this->redirect(array('dashboard/index'));
|
||||
}
|
||||
|
||||
/**
|
||||
* This is the action to handle external exceptions.
|
||||
*/
|
||||
public function actionError() {
|
||||
if ($error = Yii::app()->errorHandler->error) {
|
||||
if (Yii::app()->request->isAjaxRequest)
|
||||
echo $error['message'];
|
||||
else
|
||||
$this->render('error', $error);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
BIN
protected/docs/database/database_model_old.mwb
Normal file
39
protected/docs/database/inital_data.sql
Normal file
@ -0,0 +1,39 @@
|
||||
-- phpMyAdmin SQL Dump
|
||||
-- version 4.0.0-rc2
|
||||
-- http://www.phpmyadmin.net
|
||||
--
|
||||
-- Host: localhost
|
||||
-- Erstellungszeit: 21. Sep 2013 um 06:31
|
||||
-- Server Version: 5.1.66-0+squeeze1
|
||||
-- PHP-Version: 5.3.3-7+squeeze15
|
||||
|
||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||
SET time_zone = "+00:00";
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- Datenbank: `zamm_clean`
|
||||
--
|
||||
|
||||
--
|
||||
-- Daten für Tabelle `group`
|
||||
--
|
||||
|
||||
INSERT INTO `group` (`id`, `space_id`, `name`, `description`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES
|
||||
(1, NULL, 'Example Group', '', '2012-10-16 01:06:19', 1, '2012-10-16 01:06:19', 1);
|
||||
|
||||
--
|
||||
-- Daten für Tabelle `registry`
|
||||
--
|
||||
|
||||
INSERT INTO `registry` (`id`, `name`, `value`, `value_text`, `module_id`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES
|
||||
(1, 'dbVersion', '20', NULL, NULL, '0000-00-00 00:00:00', 0, '2013-06-08 15:15:45', 0);
|
||||
|
||||
--
|
||||
-- Daten für Tabelle `user`
|
||||
--
|
||||
|
||||
INSERT INTO `user` (`id`, `guid`, `user_invite_id`, `wall_id`, `group_id`, `status`, `super_admin`, `username`, `email`, `password`, `auth_mode`, `firstname`, `lastname`, `title`, `street`, `zip`, `city`, `country`, `state`, `about`, `tags`, `phone_private`, `phone_work`, `mobile`, `fax`, `language`, `im_skype`, `im_msn`, `im_icq`, `im_xmpp`, `url`, `url_facebook`, `url_linkedin`, `url_xing`, `url_youtube`, `url_vimeo`, `url_flickr`, `url_myspace`, `url_googleplus`, `url_twitter`, `receive_email_notifications`, `receive_email_messaging`, `receive_email_activities`, `last_activity_email`, `created_at`, `created_by`, `updated_at`, `updated_by`) VALUES
|
||||
(1, 'b2fc71a5-abe6-adad-805f-588de32036f4', NULL, 2, 1, 1, 1, 'admin', 'l.bartholemy@zeros.ones.de', '___enc___08a593a5bec48fa3eb0c1a697968638527e83f81', 'local', 'System', 'Admin', '', '', '', 'Server', 'Germany', '', NULL, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 3, 3, 3, '2013-06-17 07:05:01', '2012-10-16 01:05:08', NULL, '2013-06-17 05:22:54', 1);
|
||||
|
625
protected/docs/database/latest_database_structure.sql
Normal file
@ -0,0 +1,625 @@
|
||||
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
|
||||
SET time_zone = "+00:00";
|
||||
|
||||
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
|
||||
/*!40101 SET NAMES utf8 */;
|
||||
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `activity` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(45) DEFAULT NULL COMMENT 'CLASS_TYPE of Activity Object',
|
||||
`module` varchar(100) NOT NULL,
|
||||
`object_model` varchar(100) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `comment` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`message` text,
|
||||
`object_model` varchar(100) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`space_id` int(11) DEFAULT NULL COMMENT 'If inside a workspace (for Counting)',
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `object_id` (`object_id`,`object_model`),
|
||||
KEY `workspace_id` (`space_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `content` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`guid` varchar(45) NOT NULL,
|
||||
`object_model` varchar(100) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`visibility` tinyint(4) DEFAULT NULL,
|
||||
`sticked` tinyint(4) DEFAULT NULL,
|
||||
`archived` tinytext,
|
||||
`space_id` int(11) DEFAULT NULL,
|
||||
`user_id` int(11) DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `object_model` (`object_model`,`object_id`),
|
||||
UNIQUE KEY `guid` (`guid`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `file` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`guid` varchar(45) DEFAULT NULL,
|
||||
`object_model` varchar(100) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`file_name` varchar(255) DEFAULT NULL,
|
||||
`title` varchar(255) DEFAULT NULL,
|
||||
`mime_type` varchar(150) DEFAULT NULL,
|
||||
`size` varchar(45) DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `guid_UNIQUE` (`guid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `group` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`space_id` int(10) DEFAULT NULL,
|
||||
`name` varchar(45) DEFAULT NULL,
|
||||
`description` text,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `group_admin` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`group_id` int(11) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `like` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`target_user_id` int(11) NOT NULL,
|
||||
`object_model` varchar(100) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `object_id_2` (`object_id`,`object_model`,`created_by`),
|
||||
KEY `object_id` (`object_id`,`object_model`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `message` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(255) DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `message_entry` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`message_id` int(11) NOT NULL,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`file_id` int(11) DEFAULT NULL,
|
||||
`content` text NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fk_message_content_message1` (`message_id`),
|
||||
KEY `fk_message_content_user1` (`user_id`),
|
||||
KEY `fk_message_entry_file1` (`file_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `migration` (
|
||||
`version` varchar(255) NOT NULL,
|
||||
`apply_time` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`version`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `module_enabled` (
|
||||
`module_id` varchar(100) NOT NULL,
|
||||
PRIMARY KEY (`module_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `note` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `notification` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`class` varchar(100) NOT NULL,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`seen` tinyint(4) DEFAULT NULL,
|
||||
`source_object_model` varchar(100) DEFAULT NULL,
|
||||
`source_object_id` int(11) DEFAULT NULL,
|
||||
`target_object_model` varchar(100) DEFAULT NULL,
|
||||
`target_object_id` int(11) DEFAULT NULL,
|
||||
`space_id` int(11) DEFAULT NULL,
|
||||
`emailed` tinyint(4) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `poll` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`question` varchar(255) NOT NULL,
|
||||
`allow_multiple` tinyint(4) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `poll_answer` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` int(11) NOT NULL,
|
||||
`answer` varchar(255) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `doodle_id` (`poll_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `poll_answer_user` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`poll_id` int(11) NOT NULL,
|
||||
`poll_answer_id` int(11) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `doodle_answer_id_2` (`poll_answer_id`,`created_by`),
|
||||
KEY `doodle_id` (`poll_id`),
|
||||
KEY `doodle_answer_id` (`poll_answer_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `post` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`message` text,
|
||||
`original_message` text,
|
||||
`url` varchar(255) DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `profile` (
|
||||
`user_id` int(11) NOT NULL,
|
||||
`firstname` varchar(255) DEFAULT NULL,
|
||||
`lastname` varchar(255) DEFAULT NULL,
|
||||
`title` varchar(255) DEFAULT NULL,
|
||||
`street` varchar(255) DEFAULT NULL,
|
||||
`zip` int(11) DEFAULT NULL,
|
||||
`city` varchar(255) DEFAULT NULL,
|
||||
`country` varchar(255) DEFAULT NULL,
|
||||
`state` varchar(255) DEFAULT NULL,
|
||||
`about` text,
|
||||
`phone_private` varchar(255) DEFAULT NULL,
|
||||
`phone_work` varchar(255) DEFAULT NULL,
|
||||
`mobile` varchar(255) DEFAULT NULL,
|
||||
`fax` varchar(255) DEFAULT NULL,
|
||||
`im_skype` varchar(255) DEFAULT NULL,
|
||||
`im_msn` varchar(255) DEFAULT NULL,
|
||||
`im_icq` int(11) DEFAULT NULL,
|
||||
`im_xmpp` varchar(255) DEFAULT NULL,
|
||||
`url` varchar(255) DEFAULT NULL,
|
||||
`url_facebook` varchar(255) DEFAULT NULL,
|
||||
`url_linkedin` varchar(255) DEFAULT NULL,
|
||||
`url_xing` varchar(255) DEFAULT NULL,
|
||||
`url_youtube` varchar(255) DEFAULT NULL,
|
||||
`url_vimeo` varchar(255) DEFAULT NULL,
|
||||
`url_flickr` varchar(255) DEFAULT NULL,
|
||||
`url_myspace` varchar(255) DEFAULT NULL,
|
||||
`url_googleplus` varchar(255) DEFAULT NULL,
|
||||
`url_twitter` varchar(255) DEFAULT NULL,
|
||||
PRIMARY KEY (`user_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `profile_field` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`profile_field_category_id` int(11) NOT NULL,
|
||||
`module_id` varchar(255) DEFAULT NULL,
|
||||
`field_type_class` varchar(255) NOT NULL,
|
||||
`field_type_config` text,
|
||||
`internal_name` varchar(100) NOT NULL,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`description` text,
|
||||
`sort_order` int(11) NOT NULL,
|
||||
`required` tinyint(4) DEFAULT NULL,
|
||||
`show_at_registration` tinyint(4) DEFAULT NULL,
|
||||
`editable` tinyint(4) NOT NULL DEFAULT '1',
|
||||
`visible` tinyint(4) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `profile_field_category` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(255) NOT NULL,
|
||||
`description` text NOT NULL,
|
||||
`sort_order` int(11) NOT NULL,
|
||||
`module_id` int(11) DEFAULT NULL,
|
||||
`visibility` tinyint(4) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `setting` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL,
|
||||
`value` varchar(255) NOT NULL,
|
||||
`value_text` text,
|
||||
`module_id` varchar(100) DEFAULT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `name` (`name`,`module_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `sifeedback` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`message` text NOT NULL,
|
||||
`username` varchar(255) NOT NULL,
|
||||
`email` varchar(255) NOT NULL,
|
||||
`current_url` varchar(255) NOT NULL,
|
||||
`rating` varchar(255) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `space` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`guid` varchar(45) DEFAULT NULL,
|
||||
`wall_id` int(11) DEFAULT NULL,
|
||||
`name` varchar(45) NOT NULL,
|
||||
`description` text,
|
||||
`website` varchar(45) DEFAULT NULL,
|
||||
`join_policy` tinyint(4) DEFAULT NULL COMMENT '0=NO; 1=application; 2=free',
|
||||
`visibility` tinyint(4) DEFAULT NULL COMMENT '0=Unvisible; 1=Registered Only; 2=Always/Everybody',
|
||||
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '0=Disabled; 1=Enabled; 2=Archived',
|
||||
`tags` text,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `name` (`name`),
|
||||
UNIQUE KEY `guid` (`guid`),
|
||||
KEY `fk_Group_Wall1` (`wall_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `space_follow` (
|
||||
`user_id` int(11) NOT NULL,
|
||||
`space_id` int(11) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`user_id`,`space_id`),
|
||||
KEY `fk_user_has_workspace_workspace1` (`space_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `space_module` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`module_id` varchar(255) NOT NULL,
|
||||
`space_id` int(11) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `task` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`title` text NOT NULL,
|
||||
`deathline` datetime DEFAULT NULL,
|
||||
`max_users` int(11) NOT NULL,
|
||||
`status` int(11) NOT NULL,
|
||||
`percent` smallint(6) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `task_user` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`task_id` int(11) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `user_id` (`user_id`,`task_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`guid` varchar(45) DEFAULT NULL,
|
||||
`user_invite_id` int(11) DEFAULT NULL,
|
||||
`wall_id` int(11) DEFAULT NULL,
|
||||
`group_id` int(11) DEFAULT NULL,
|
||||
`status` tinyint(4) NOT NULL DEFAULT '2' COMMENT '0=Disabled; 1=Enabled; 2=NeedApproval; 3=Deleted',
|
||||
`super_admin` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Is SuperAdmin?',
|
||||
`username` varchar(25) DEFAULT NULL,
|
||||
`email` varchar(100) DEFAULT NULL,
|
||||
`password` varchar(200) DEFAULT NULL,
|
||||
`auth_mode` varchar(10) NOT NULL,
|
||||
`tags` text,
|
||||
`language` varchar(5) NOT NULL,
|
||||
`receive_email_notifications` tinyint(4) NOT NULL,
|
||||
`receive_email_messaging` tinyint(4) NOT NULL,
|
||||
`receive_email_activities` tinyint(4) NOT NULL,
|
||||
`last_activity_email` datetime NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idUser_UNIQUE` (`id`),
|
||||
UNIQUE KEY `email_UNIQUE` (`email`),
|
||||
UNIQUE KEY `username_UNIQUE` (`username`),
|
||||
UNIQUE KEY `idWall_UNIQUE` (`wall_id`),
|
||||
UNIQUE KEY `idUserInvite_UNIQUE` (`user_invite_id`),
|
||||
KEY `fk_user_group1` (`group_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_content` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`object_model` varchar(100) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `user_id` (`user_id`,`object_model`,`object_id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_follow` (
|
||||
`user_follower_id` int(11) NOT NULL,
|
||||
`user_followed_id` int(11) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`user_follower_id`,`user_followed_id`),
|
||||
KEY `fk_UserFollows_User2` (`user_followed_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_http_session` (
|
||||
`id` char(32) NOT NULL,
|
||||
`expire` int(11) DEFAULT NULL,
|
||||
`user_id` int(11) DEFAULT NULL,
|
||||
`data` longblob,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_invite` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_originator_id` int(11) DEFAULT NULL,
|
||||
`space_invite_id` int(11) DEFAULT NULL,
|
||||
`email` varchar(45) NOT NULL,
|
||||
`source` varchar(45) DEFAULT NULL COMMENT 'Source Key where invite comes from',
|
||||
`token` varchar(45) DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `email_UNIQUE` (`email`),
|
||||
UNIQUE KEY `token_UNIQUE` (`token`),
|
||||
KEY `fk_user_invite_Group1` (`space_invite_id`),
|
||||
KEY `fk_user_invite_user1` (`user_originator_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_message` (
|
||||
`message_id` int(11) NOT NULL,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`is_originator` tinyint(4) DEFAULT NULL,
|
||||
`last_viewed` datetime DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`message_id`,`user_id`),
|
||||
KEY `fk_message_has_user_user1` (`user_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_module` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`module_id` varchar(255) NOT NULL,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_old` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`guid` varchar(45) DEFAULT NULL,
|
||||
`user_invite_id` int(11) DEFAULT NULL,
|
||||
`wall_id` int(11) DEFAULT NULL,
|
||||
`group_id` int(11) DEFAULT NULL,
|
||||
`status` tinyint(4) NOT NULL DEFAULT '2' COMMENT '0=Disabled; 1=Enabled; 2=NeedApproval; 3=Deleted',
|
||||
`super_admin` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Is SuperAdmin?',
|
||||
`username` varchar(25) DEFAULT NULL,
|
||||
`email` varchar(100) DEFAULT NULL,
|
||||
`password` varchar(200) DEFAULT NULL,
|
||||
`auth_mode` varchar(10) NOT NULL,
|
||||
`firstname` varchar(45) DEFAULT NULL,
|
||||
`lastname` varchar(45) DEFAULT NULL,
|
||||
`title` varchar(45) DEFAULT NULL COMMENT 'z.B. Kaffeetrinker',
|
||||
`street` varchar(45) DEFAULT NULL,
|
||||
`zip` varchar(45) DEFAULT NULL,
|
||||
`city` varchar(45) DEFAULT NULL,
|
||||
`country` varchar(45) DEFAULT NULL,
|
||||
`state` varchar(45) DEFAULT NULL,
|
||||
`about` text,
|
||||
`tags` text,
|
||||
`phone_private` varchar(100) NOT NULL,
|
||||
`phone_work` varchar(100) NOT NULL,
|
||||
`mobile` varchar(100) NOT NULL,
|
||||
`fax` varchar(100) NOT NULL,
|
||||
`language` varchar(5) NOT NULL,
|
||||
`im_skype` varchar(100) NOT NULL,
|
||||
`im_msn` varchar(100) NOT NULL,
|
||||
`im_icq` varchar(100) NOT NULL,
|
||||
`im_xmpp` varchar(100) NOT NULL,
|
||||
`url` varchar(255) NOT NULL,
|
||||
`url_facebook` varchar(255) NOT NULL,
|
||||
`url_linkedin` varchar(255) NOT NULL,
|
||||
`url_xing` varchar(255) NOT NULL,
|
||||
`url_youtube` varchar(255) NOT NULL,
|
||||
`url_vimeo` varchar(255) NOT NULL,
|
||||
`url_flickr` varchar(255) NOT NULL,
|
||||
`url_myspace` varchar(255) NOT NULL,
|
||||
`url_googleplus` varchar(255) NOT NULL,
|
||||
`url_twitter` varchar(255) NOT NULL,
|
||||
`receive_email_notifications` tinyint(4) NOT NULL,
|
||||
`receive_email_messaging` tinyint(4) NOT NULL,
|
||||
`receive_email_activities` tinyint(4) NOT NULL,
|
||||
`last_activity_email` datetime NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `idUser_UNIQUE` (`id`),
|
||||
UNIQUE KEY `email_UNIQUE` (`email`),
|
||||
UNIQUE KEY `username_UNIQUE` (`username`),
|
||||
UNIQUE KEY `idWall_UNIQUE` (`wall_id`),
|
||||
UNIQUE KEY `idUserInvite_UNIQUE` (`user_invite_id`),
|
||||
KEY `fk_user_group1` (`group_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `user_space_membership` (
|
||||
`space_id` int(11) NOT NULL,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`originator_user_id` varchar(45) DEFAULT NULL,
|
||||
`status` tinyint(4) DEFAULT NULL COMMENT 'INVITED, APPLICANT, MEMBER',
|
||||
`request_message` text,
|
||||
`last_visit` datetime DEFAULT NULL,
|
||||
`invite_role` tinyint(4) DEFAULT NULL,
|
||||
`admin_role` tinyint(4) DEFAULT NULL,
|
||||
`share_role` tinyint(4) DEFAULT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`space_id`,`user_id`),
|
||||
KEY `fk_Group_has_User_User1` (`user_id`),
|
||||
KEY `status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `wall` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`type` varchar(45) DEFAULT NULL COMMENT 'USER, WORKSPACE',
|
||||
`object_model` varchar(50) NOT NULL,
|
||||
`object_id` int(11) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `object_model` (`object_model`,`object_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `wall_entry` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`wall_id` int(11) NOT NULL,
|
||||
`content_id` int(11) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `fk_WallEntry_Wall1` (`wall_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `zstunden_projekt_space` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`space_id` int(11) NOT NULL,
|
||||
`projekt_nr` varchar(100) NOT NULL,
|
||||
`created_at` datetime DEFAULT NULL,
|
||||
`created_by` int(11) DEFAULT NULL,
|
||||
`updated_at` datetime DEFAULT NULL,
|
||||
`updated_by` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `zstunden_timer` (
|
||||
`id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL,
|
||||
`projekt_nr` varchar(50) NOT NULL,
|
||||
`projektname` varchar(255) NOT NULL,
|
||||
`unterprojekt` varchar(255) NOT NULL,
|
||||
`ansprechpartner` varchar(255) NOT NULL,
|
||||
`pause_since` datetime NOT NULL,
|
||||
`created_at` datetime NOT NULL,
|
||||
`created_by` int(11) NOT NULL,
|
||||
`updated_at` datetime NOT NULL,
|
||||
`updated_by` int(11) NOT NULL,
|
||||
`pause_total` int(11) NOT NULL,
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
|
||||
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
|
||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
25
protected/docs/guide/administration/bundled_software.md
Normal file
@ -0,0 +1,25 @@
|
||||
Bundled Software / Libaries
|
||||
===========================
|
||||
|
||||
* Yii Framework (Core Framework) http://www.yiiframework.com/
|
||||
* Zend Framework (Lucene Index)
|
||||
* Code Igniter (Security Functions)
|
||||
* ADLdap (Active Directory / Ldap) http://adldap.sourceforge.net/
|
||||
* Some Yii Extensions (See /protected/extensions/)
|
||||
* PHP Markdown by by Michel Fortin (ZammDoc Module)
|
||||
* Yii-Mail - http://www.yiiframework.com/extension/mail/
|
||||
* SwiftMailer - http://swiftmailer.org
|
||||
* jQuery - http://jquery.com
|
||||
* jQuery Cookie Plugin - https://github.com/carhartl/jquery-cookie
|
||||
* jQuery Knob - http://anthonyterrien.com/knob/
|
||||
* Twitter Bootstrap - http://getbootstrap.com/
|
||||
* Bootstrap-datepicker.js - http://www.eyecon.ro/bootstrap-datepicker
|
||||
* Lightbox for Bootstrap 3 - https://github.com/ashleydw/lightbox
|
||||
* Modernizr - http://modernizr.com/
|
||||
* HTML5 Shiv - https://github.com/aFarkas/html5shiv
|
||||
* Wysihtml5 - https://github.com/xing/wysihtml5
|
||||
* Bootstrap-wysihtml5 - http://jhollingworth.github.io/bootstrap-wysihtml5/
|
||||
* Autosize - http://www.jacklmoore.com/autosize
|
||||
* Highlight - http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html
|
||||
* Timeago - http://timeago.yarp.com/
|
||||
|
9
protected/docs/guide/administration/console.md
Normal file
@ -0,0 +1,9 @@
|
||||
Console
|
||||
=======
|
||||
|
||||
Zamm provides several console commands to manage the application.
|
||||
|
||||
Run ``./protected/yiic help`` for a full overview.
|
||||
|
||||
Make sure /protected/yiic or /protected/yiic.bat are executable.
|
||||
|
4
protected/docs/guide/administration/cronjobs.md
Normal file
@ -0,0 +1,4 @@
|
||||
CronJobs
|
||||
========
|
||||
|
||||
See ``Administration -> Settings -> CronJobs`` for a complete list of required cronjobs.
|
23
protected/docs/guide/administration/index.md
Normal file
@ -0,0 +1,23 @@
|
||||
Administration Guide/Notes
|
||||
===========================
|
||||
|
||||
|
||||
##Installation
|
||||
- [Requirements](requirements.md)
|
||||
- [Installer](installer.md)
|
||||
- [Cronjobs](cronjobs.md)
|
||||
|
||||
##Updating
|
||||
- [Updating](updating.md)
|
||||
|
||||
|
||||
##Advanced Topics
|
||||
- [Logging](logging.md)
|
||||
- [Security](security.md)
|
||||
- [Console](console.md)
|
||||
- [Search](search.md)
|
||||
- [X-Sendfile](xsendfile.md)
|
||||
- [LDAP](ldap.md)
|
||||
|
||||
## More
|
||||
- [Bundled Software](bundled_software.md)
|
8
protected/docs/guide/administration/installer.md
Normal file
@ -0,0 +1,8 @@
|
||||
Installation using the installer
|
||||
=================================
|
||||
|
||||
1. Create a mysql database
|
||||
2. Extract install package in a web/htdocs folder
|
||||
3. Open that folder (e.g. http://localhost/humhub)
|
||||
4. Installer will start
|
||||
|
47
protected/docs/guide/administration/ldap.md
Normal file
@ -0,0 +1,47 @@
|
||||
LDAP Support
|
||||
============
|
||||
|
||||
This feature is highly experimental and requires PHP LDAP Support!
|
||||
|
||||
|
||||
|
||||
Configuration
|
||||
--------------
|
||||
|
||||
Add following under ``protected/config/_settings.php`` in the ´´params -> auth`` array.
|
||||
|
||||
// LDAP Specifc Settings
|
||||
'ldap' => array(
|
||||
|
||||
// User Group
|
||||
'userGroup' => 'CN=office,CN=Users,DC=domain,DC=local',
|
||||
|
||||
// Account
|
||||
'adminUser' => 'Admin User',
|
||||
'adminPassword' => 'xxx',
|
||||
|
||||
// Connection String
|
||||
'adldapConfig' => array('base_dn'=>'DC=domain,DC=local','account_suffix'=>'@domain.local', 'domain_controllers'=>array('localhost')),
|
||||
|
||||
// Mapping between LDAP Group and Space
|
||||
'groupToSpaceMap' => array(
|
||||
'CN=someGroup,CN=Users,DC=domain,DC=local' => 'Office',
|
||||
// ...
|
||||
),
|
||||
|
||||
// Field Sync (LDAP -> User Field)
|
||||
'fieldMapping' => array(
|
||||
'lastname' => array('ldapField'=>'sn', 'sync'=>'fromLdap'),
|
||||
'firstname' => array('ldapField'=>'givenname', 'sync'=>'fromLdap'),
|
||||
//'city' => array('ldapField'=>'givenname', 'sync'=>'full'),
|
||||
//'state' => array('ldapField'=>'st', 'sync'=>'full'),
|
||||
//'country' => array('ldapField'=>'c', 'sync'=>'fromLdap'),
|
||||
//'country' => array('ldapField'=>'c', 'sync'=>'fromLdap'),
|
||||
),
|
||||
|
||||
),
|
||||
|
||||
LDAP also needs a cronjob
|
||||
|
||||
# When using LDAP
|
||||
45 * * * * /path/to/protected/protected/yiic ldap_update >/dev/null 2>&1
|
4
protected/docs/guide/administration/logging.md
Normal file
@ -0,0 +1,4 @@
|
||||
Logging
|
||||
============
|
||||
|
||||
Log Files are stored unter ``protected/runtime/application.log``
|
21
protected/docs/guide/administration/requirements.md
Normal file
@ -0,0 +1,21 @@
|
||||
Requirements
|
||||
============
|
||||
|
||||
### General Requirements:
|
||||
* PHP 5.2+
|
||||
* MySQL
|
||||
* Apache 2.x
|
||||
* ImageMagick
|
||||
* CUrl PHP Extension (For OEmbed Features)
|
||||
|
||||
|
||||
### Packages for Debian/Ubuntu users:
|
||||
* imagemagick
|
||||
* php5-curl
|
||||
* php5-mysql
|
||||
* php5-gd
|
||||
* php5-cli
|
||||
* php5-ldap (optional)
|
||||
* php-apc (optional)
|
||||
* php5-memcached (optional)
|
||||
* libapache2-mod-xsendfile (optional)
|