Some changes
This commit is contained in:
parent
c6cf5b4f9d
commit
f3de688786
218 changed files with 26719 additions and 99 deletions
1
Dockerfile
Normal file
1
Dockerfile
Normal file
|
@ -0,0 +1 @@
|
|||
FROM node:15-alpine
|
661
LICENSE
Normal file
661
LICENSE
Normal file
|
@ -0,0 +1,661 @@
|
|||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://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 <https://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
|
||||
<https://www.gnu.org/licenses/>.
|
104
README.md
104
README.md
|
@ -1,105 +1,15 @@
|
|||
*Looking for a shareable component template? Go here --> [sveltejs/component-template](https://github.com/sveltejs/component-template)*
|
||||
# Custom frontend example for Lemmy
|
||||
|
||||
---
|
||||
|
||||
# svelte app
|
||||
|
||||
This is a project template for [Svelte](https://svelte.dev) apps. It lives at https://github.com/sveltejs/template.
|
||||
|
||||
To create a new project based on this template using [degit](https://github.com/Rich-Harris/degit):
|
||||
|
||||
```bash
|
||||
npx degit sveltejs/template svelte-app
|
||||
cd svelte-app
|
||||
```
|
||||
|
||||
*Note that you will need to have [Node.js](https://nodejs.org) installed.*
|
||||
|
||||
|
||||
## Get started
|
||||
## Development
|
||||
|
||||
Install the dependencies...
|
||||
|
||||
```bash
|
||||
cd svelte-app
|
||||
npm install
|
||||
apt install yarn
|
||||
yarn install
|
||||
yarn run dev
|
||||
```
|
||||
|
||||
...then start [Rollup](https://rollupjs.org):
|
||||
## License
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Navigate to [localhost:5000](http://localhost:5000). You should see your app running. Edit a component file in `src`, save it, and reload the page to see your changes.
|
||||
|
||||
By default, the server will only respond to requests from localhost. To allow connections from other computers, edit the `sirv` commands in package.json to include the option `--host 0.0.0.0`.
|
||||
|
||||
If you're using [Visual Studio Code](https://code.visualstudio.com/) we recommend installing the official extension [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). If you are using other editors you may need to install a plugin in order to get syntax highlighting and intellisense.
|
||||
|
||||
## Building and running in production mode
|
||||
|
||||
To create an optimised version of the app:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
You can run the newly built app with `npm run start`. This uses [sirv](https://github.com/lukeed/sirv), which is included in your package.json's `dependencies` so that the app will work when you deploy to platforms like [Heroku](https://heroku.com).
|
||||
|
||||
|
||||
## Single-page app mode
|
||||
|
||||
By default, sirv will only respond to requests that match files in `public`. This is to maximise compatibility with static fileservers, allowing you to deploy your app anywhere.
|
||||
|
||||
If you're building a single-page app (SPA) with multiple routes, sirv needs to be able to respond to requests for *any* path. You can make it so by editing the `"start"` command in package.json:
|
||||
|
||||
```js
|
||||
"start": "sirv public --single"
|
||||
```
|
||||
|
||||
## Using TypeScript
|
||||
|
||||
This template comes with a script to set up a TypeScript development environment, you can run it immediately after cloning the template with:
|
||||
|
||||
```bash
|
||||
node scripts/setupTypeScript.js
|
||||
```
|
||||
|
||||
Or remove the script via:
|
||||
|
||||
```bash
|
||||
rm scripts/setupTypeScript.js
|
||||
```
|
||||
|
||||
## Deploying to the web
|
||||
|
||||
### With [Vercel](https://vercel.com)
|
||||
|
||||
Install `vercel` if you haven't already:
|
||||
|
||||
```bash
|
||||
npm install -g vercel
|
||||
```
|
||||
|
||||
Then, from within your project folder:
|
||||
|
||||
```bash
|
||||
cd public
|
||||
vercel deploy --name my-project
|
||||
```
|
||||
|
||||
### With [surge](https://surge.sh/)
|
||||
|
||||
Install `surge` if you haven't already:
|
||||
|
||||
```bash
|
||||
npm install -g surge
|
||||
```
|
||||
|
||||
Then, from within your project folder:
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
surge public my-project.surge.sh
|
||||
```
|
||||
[GNU Affero General Public License v3.0](./LICENSE)
|
48
docker-compose.yml
Normal file
48
docker-compose.yml
Normal file
|
@ -0,0 +1,48 @@
|
|||
version: '2.2'
|
||||
|
||||
services:
|
||||
lemmy-phpbb:
|
||||
ports:
|
||||
- "1236:1234"
|
||||
restart: always
|
||||
environment:
|
||||
- LEMMY_INTERNAL_HOST=lemmy:8536
|
||||
- LEMMY_EXTERNAL_HOST=localhost:8536
|
||||
- LEMMY_HTTPS=false
|
||||
build: .
|
||||
depends_on:
|
||||
- lemmy
|
||||
|
||||
lemmy-ui:
|
||||
image: dessalines/lemmy-ui:v0.8.7
|
||||
ports:
|
||||
- "1235:1234"
|
||||
restart: always
|
||||
environment:
|
||||
- LEMMY_INTERNAL_HOST=lemmy:8536
|
||||
- LEMMY_EXTERNAL_HOST=localhost:8536
|
||||
- LEMMY_HTTPS=false
|
||||
depends_on:
|
||||
- lemmy
|
||||
|
||||
lemmy:
|
||||
image: dessalines/lemmy:v0.8.7
|
||||
ports:
|
||||
- "127.0.0.1:8536:8536"
|
||||
restart: always
|
||||
environment:
|
||||
- RUST_LOG=error
|
||||
volumes:
|
||||
- ./lemmy-config.hjson:/config/config.hjson
|
||||
depends_on:
|
||||
- postgres
|
||||
|
||||
postgres:
|
||||
image: postgres:12-alpine
|
||||
environment:
|
||||
- POSTGRES_USER=lemmy
|
||||
- POSTGRES_PASSWORD=password
|
||||
- POSTGRES_DB=lemmy
|
||||
volumes:
|
||||
- ./volumes/postgres:/var/lib/postgresql/data
|
||||
restart: always
|
47
lemmy-config.hjson
Normal file
47
lemmy-config.hjson
Normal file
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
# for more info about the config, check out the documentation
|
||||
# https://dev.lemmy.ml/docs/administration_configuration.html
|
||||
|
||||
setup: {
|
||||
# username for the admin user
|
||||
admin_username: "lemmy"
|
||||
# password for the admin user
|
||||
admin_password: "lemmy"
|
||||
# name of the site (can be changed later)
|
||||
site_name: "lemmy-test"
|
||||
}
|
||||
|
||||
# the domain name of your instance (eg "dev.lemmy.ml")
|
||||
hostname: "my_domain"
|
||||
# address where lemmy should listen for incoming requests
|
||||
bind: "0.0.0.0"
|
||||
# port where lemmy should listen for incoming requests
|
||||
port: 8536
|
||||
# json web token for authorization between server and client
|
||||
jwt_secret: "changeme"
|
||||
# settings related to the postgresql database
|
||||
database: {
|
||||
# name of the postgres database for lemmy
|
||||
database: "lemmy"
|
||||
# username to connect to postgres
|
||||
user: "lemmy"
|
||||
# password to connect to postgres
|
||||
password: "password"
|
||||
# host where postgres is running
|
||||
host: "postgres"
|
||||
}
|
||||
# # optional: email sending configuration
|
||||
# email: {
|
||||
# # hostname and port of the smtp server
|
||||
# smtp_server: ""
|
||||
# # login name for smtp server
|
||||
# smtp_login: ""
|
||||
# # password to login to the smtp server
|
||||
# smtp_password: ""
|
||||
# # address to send emails from, eg "noreply@your-instance.com"
|
||||
# smtp_from_address: ""
|
||||
# # whether or not smtp connections should use tls
|
||||
# use_tls: true
|
||||
# }
|
||||
}
|
||||
|
779
package-lock.json
generated
Normal file
779
package-lock.json
generated
Normal file
|
@ -0,0 +1,779 @@
|
|||
{
|
||||
"name": "svelte-app",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@babel/code-frame": {
|
||||
"version": "7.10.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
|
||||
"integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/highlight": "^7.10.4"
|
||||
}
|
||||
},
|
||||
"@babel/helper-validator-identifier": {
|
||||
"version": "7.10.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
|
||||
"integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
|
||||
"dev": true
|
||||
},
|
||||
"@babel/highlight": {
|
||||
"version": "7.10.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
|
||||
"integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/helper-validator-identifier": "^7.10.4",
|
||||
"chalk": "^2.0.0",
|
||||
"js-tokens": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@polka/url": {
|
||||
"version": "1.0.0-next.11",
|
||||
"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.11.tgz",
|
||||
"integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA=="
|
||||
},
|
||||
"@rollup/plugin-commonjs": {
|
||||
"version": "14.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-14.0.0.tgz",
|
||||
"integrity": "sha512-+PSmD9ePwTAeU106i9FRdc+Zb3XUWyW26mo5Atr2mk82hor8+nPwkztEjFo8/B1fJKfaQDg9aM2bzQkjhi7zOw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@rollup/pluginutils": "^3.0.8",
|
||||
"commondir": "^1.0.1",
|
||||
"estree-walker": "^1.0.1",
|
||||
"glob": "^7.1.2",
|
||||
"is-reference": "^1.1.2",
|
||||
"magic-string": "^0.25.2",
|
||||
"resolve": "^1.11.0"
|
||||
}
|
||||
},
|
||||
"@rollup/plugin-node-resolve": {
|
||||
"version": "8.4.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz",
|
||||
"integrity": "sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@rollup/pluginutils": "^3.1.0",
|
||||
"@types/resolve": "1.17.1",
|
||||
"builtin-modules": "^3.1.0",
|
||||
"deep-freeze": "^0.0.1",
|
||||
"deepmerge": "^4.2.2",
|
||||
"is-module": "^1.0.0",
|
||||
"resolve": "^1.17.0"
|
||||
}
|
||||
},
|
||||
"@rollup/pluginutils": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
|
||||
"integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/estree": "0.0.39",
|
||||
"estree-walker": "^1.0.1",
|
||||
"picomatch": "^2.2.2"
|
||||
}
|
||||
},
|
||||
"@types/estree": {
|
||||
"version": "0.0.39",
|
||||
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
|
||||
"integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "14.14.8",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.8.tgz",
|
||||
"integrity": "sha512-z/5Yd59dCKI5kbxauAJgw6dLPzW+TNOItNE00PkpzNwUIEwdj/Lsqwq94H5DdYBX7C13aRA0CY32BK76+neEUA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/resolve": {
|
||||
"version": "1.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
|
||||
"integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*"
|
||||
}
|
||||
},
|
||||
"ansi-styles": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
||||
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-convert": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"anymatch": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
|
||||
"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"normalize-path": "^3.0.0",
|
||||
"picomatch": "^2.0.4"
|
||||
}
|
||||
},
|
||||
"async-limiter": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
|
||||
"integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
|
||||
"dev": true
|
||||
},
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
||||
"dev": true
|
||||
},
|
||||
"binary-extensions": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
|
||||
"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
|
||||
"dev": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.0.1"
|
||||
}
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
|
||||
"dev": true
|
||||
},
|
||||
"builtin-modules": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
|
||||
"integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
|
||||
"dev": true
|
||||
},
|
||||
"chalk": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "^3.2.1",
|
||||
"escape-string-regexp": "^1.0.5",
|
||||
"supports-color": "^5.3.0"
|
||||
}
|
||||
},
|
||||
"chokidar": {
|
||||
"version": "3.4.3",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
|
||||
"integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"anymatch": "~3.1.1",
|
||||
"braces": "~3.0.2",
|
||||
"fsevents": "~2.1.2",
|
||||
"glob-parent": "~5.1.0",
|
||||
"is-binary-path": "~2.1.0",
|
||||
"is-glob": "~4.0.1",
|
||||
"normalize-path": "~3.0.0",
|
||||
"readdirp": "~3.5.0"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
|
||||
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"color-name": "1.1.3"
|
||||
}
|
||||
},
|
||||
"color-name": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
|
||||
"dev": true
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.20.3",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||
"dev": true
|
||||
},
|
||||
"commondir": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
|
||||
"integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
|
||||
"dev": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
|
||||
"dev": true
|
||||
},
|
||||
"console-clear": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz",
|
||||
"integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ=="
|
||||
},
|
||||
"deep-freeze": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
|
||||
"integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=",
|
||||
"dev": true
|
||||
},
|
||||
"deepmerge": {
|
||||
"version": "4.2.2",
|
||||
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
|
||||
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
|
||||
"dev": true
|
||||
},
|
||||
"escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
|
||||
"dev": true
|
||||
},
|
||||
"estree-walker": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
|
||||
"integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
|
||||
"dev": true
|
||||
},
|
||||
"fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
|
||||
"dev": true
|
||||
},
|
||||
"fsevents": {
|
||||
"version": "2.1.3",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
|
||||
"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"function-bind": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
||||
"dev": true
|
||||
},
|
||||
"get-port": {
|
||||
"version": "3.2.0",
|
||||
"resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
|
||||
"integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw="
|
||||
},
|
||||
"glob": {
|
||||
"version": "7.1.6",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
|
||||
"integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fs.realpath": "^1.0.0",
|
||||
"inflight": "^1.0.4",
|
||||
"inherits": "2",
|
||||
"minimatch": "^3.0.4",
|
||||
"once": "^1.3.0",
|
||||
"path-is-absolute": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"glob-parent": {
|
||||
"version": "5.1.1",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
|
||||
"integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-glob": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"has": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"function-bind": "^1.1.1"
|
||||
}
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
|
||||
"dev": true
|
||||
},
|
||||
"inflight": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"once": "^1.3.0",
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
|
||||
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
|
||||
"dev": true
|
||||
},
|
||||
"is-binary-path": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
||||
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"binary-extensions": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"is-core-module": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
|
||||
"integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has": "^1.0.3"
|
||||
}
|
||||
},
|
||||
"is-extglob": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
|
||||
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
|
||||
"dev": true
|
||||
},
|
||||
"is-glob": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
|
||||
"integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-extglob": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"is-module": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
|
||||
"integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
|
||||
"dev": true
|
||||
},
|
||||
"is-number": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true
|
||||
},
|
||||
"is-reference": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
|
||||
"integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/estree": "*"
|
||||
}
|
||||
},
|
||||
"jest-worker": {
|
||||
"version": "26.6.2",
|
||||
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
|
||||
"integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/node": "*",
|
||||
"merge-stream": "^2.0.0",
|
||||
"supports-color": "^7.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"has-flag": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "7.2.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^4.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
|
||||
"dev": true
|
||||
},
|
||||
"kleur": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
|
||||
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
|
||||
},
|
||||
"lemmy-js-client": {
|
||||
"version": "1.0.16",
|
||||
"resolved": "https://registry.npmjs.org/lemmy-js-client/-/lemmy-js-client-1.0.16.tgz",
|
||||
"integrity": "sha512-WvEEGrYNA2dzfzlufWB9LhUcll0O06WaUjSfBn5lYY/SFFsvBW5ImD42P/QwvN8Sgj6xVQiboe+Z8T++iAjKVw=="
|
||||
},
|
||||
"livereload": {
|
||||
"version": "0.9.1",
|
||||
"resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz",
|
||||
"integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chokidar": "^3.3.0",
|
||||
"livereload-js": "^3.1.0",
|
||||
"opts": ">= 1.2.0",
|
||||
"ws": "^6.2.1"
|
||||
}
|
||||
},
|
||||
"livereload-js": {
|
||||
"version": "3.3.1",
|
||||
"resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.3.1.tgz",
|
||||
"integrity": "sha512-CBu1gTEfzVhlOK1WASKAAJ9Qx1fHECTq0SUB67sfxwQssopTyvzqTlgl+c0h9pZ6V+Fzd2rc510ppuNusg9teQ==",
|
||||
"dev": true
|
||||
},
|
||||
"local-access": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/local-access/-/local-access-1.1.0.tgz",
|
||||
"integrity": "sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw=="
|
||||
},
|
||||
"magic-string": {
|
||||
"version": "0.25.7",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
|
||||
"integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"sourcemap-codec": "^1.4.4"
|
||||
}
|
||||
},
|
||||
"merge-stream": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
|
||||
"dev": true
|
||||
},
|
||||
"mime": {
|
||||
"version": "2.4.6",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
|
||||
"integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA=="
|
||||
},
|
||||
"minimatch": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
},
|
||||
"mri": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
|
||||
"integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ=="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
|
||||
},
|
||||
"normalize-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
|
||||
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
|
||||
"dev": true
|
||||
},
|
||||
"once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
},
|
||||
"opts": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/opts/-/opts-2.0.2.tgz",
|
||||
"integrity": "sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==",
|
||||
"dev": true
|
||||
},
|
||||
"path-is-absolute": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
|
||||
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
|
||||
"dev": true
|
||||
},
|
||||
"path-parse": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
|
||||
"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
|
||||
"dev": true
|
||||
},
|
||||
"picomatch": {
|
||||
"version": "2.2.2",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
|
||||
"integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
|
||||
"dev": true
|
||||
},
|
||||
"randombytes": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
|
||||
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.0"
|
||||
}
|
||||
},
|
||||
"readdirp": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
|
||||
"integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"picomatch": "^2.2.1"
|
||||
}
|
||||
},
|
||||
"require-relative": {
|
||||
"version": "0.8.7",
|
||||
"resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
|
||||
"integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=",
|
||||
"dev": true
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.19.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
|
||||
"integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-core-module": "^2.1.0",
|
||||
"path-parse": "^1.0.6"
|
||||
}
|
||||
},
|
||||
"rollup": {
|
||||
"version": "2.33.3",
|
||||
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.33.3.tgz",
|
||||
"integrity": "sha512-RpayhPTe4Gu/uFGCmk7Gp5Z9Qic2VsqZ040G+KZZvsZYdcuWaJg678JeDJJvJeEQXminu24a2au+y92CUWVd+w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fsevents": "~2.1.2"
|
||||
}
|
||||
},
|
||||
"rollup-plugin-livereload": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-2.0.0.tgz",
|
||||
"integrity": "sha512-oC/8NqumGYuphkqrfszOHUUIwzKsaHBICw6QRwT5uD07gvePTS+HW+GFwu6f9K8W02CUuTvtIM9AWJrbj4wE1A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"livereload": "^0.9.1"
|
||||
}
|
||||
},
|
||||
"rollup-plugin-svelte": {
|
||||
"version": "6.1.1",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-6.1.1.tgz",
|
||||
"integrity": "sha512-ijnm0pH1ScrY4uxwaNXBpNVejVzpL2769hIEbAlnqNUWZrffLspu5/k9/l/Wsj3NrEHLQ6wCKGagVJonyfN7ow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"require-relative": "^0.8.7",
|
||||
"rollup-pluginutils": "^2.8.2",
|
||||
"sourcemap-codec": "^1.4.8"
|
||||
}
|
||||
},
|
||||
"rollup-plugin-terser": {
|
||||
"version": "7.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
|
||||
"integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@babel/code-frame": "^7.10.4",
|
||||
"jest-worker": "^26.2.1",
|
||||
"serialize-javascript": "^4.0.0",
|
||||
"terser": "^5.0.0"
|
||||
}
|
||||
},
|
||||
"rollup-pluginutils": {
|
||||
"version": "2.8.2",
|
||||
"resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
|
||||
"integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"estree-walker": "^0.6.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"estree-walker": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
|
||||
"integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sade": {
|
||||
"version": "1.7.4",
|
||||
"resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz",
|
||||
"integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==",
|
||||
"requires": {
|
||||
"mri": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"safe-buffer": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
|
||||
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
|
||||
"dev": true
|
||||
},
|
||||
"semiver": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/semiver/-/semiver-1.1.0.tgz",
|
||||
"integrity": "sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg=="
|
||||
},
|
||||
"serialize-javascript": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
|
||||
"integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"randombytes": "^2.1.0"
|
||||
}
|
||||
},
|
||||
"sirv": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.7.tgz",
|
||||
"integrity": "sha512-QMT2OTD3CTr8de9VByPmvSEeyt6k8/Cxg0J2kQJ5HNhIWfhFg9ypcIWWzez9rPWnGj+WtJ7AZD/MdT/vdilV/A==",
|
||||
"requires": {
|
||||
"@polka/url": "^1.0.0-next.9",
|
||||
"mime": "^2.3.1",
|
||||
"totalist": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"sirv-cli": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-1.0.8.tgz",
|
||||
"integrity": "sha512-bJI+kkzQvMKfAOfgLzv09kWsdymLm39LgKmGjacB19GHIAQLCvXXg8e8HzcofTjDZlA8zVv4dQjU9SWkNzkJhw==",
|
||||
"requires": {
|
||||
"console-clear": "^1.1.0",
|
||||
"get-port": "^3.2.0",
|
||||
"kleur": "^3.0.0",
|
||||
"local-access": "^1.0.1",
|
||||
"sade": "^1.6.0",
|
||||
"semiver": "^1.0.0",
|
||||
"sirv": "^1.0.7",
|
||||
"tinydate": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.7.3",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
|
||||
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.19",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
|
||||
"integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
"source-map": "^0.6.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sourcemap-codec": {
|
||||
"version": "1.4.8",
|
||||
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
|
||||
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
|
||||
"dev": true
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "5.5.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
|
||||
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"has-flag": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"svelte": {
|
||||
"version": "3.29.7",
|
||||
"resolved": "https://registry.npmjs.org/svelte/-/svelte-3.29.7.tgz",
|
||||
"integrity": "sha512-rx0g311kBODvEWUU01DFBUl3MJuJven04bvTVFUG/w0On/wuj0PajQY/QlXcJndFxG+W1s8iXKaB418tdHWc3A==",
|
||||
"dev": true
|
||||
},
|
||||
"terser": {
|
||||
"version": "5.5.0",
|
||||
"resolved": "https://registry.npmjs.org/terser/-/terser-5.5.0.tgz",
|
||||
"integrity": "sha512-eopt1Gf7/AQyPhpygdKePTzaet31TvQxXvrf7xYUvD/d8qkCJm4SKPDzu+GHK5ZaYTn8rvttfqaZc3swK21e5g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"commander": "^2.20.0",
|
||||
"source-map": "~0.7.2",
|
||||
"source-map-support": "~0.5.19"
|
||||
}
|
||||
},
|
||||
"tinydate": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.3.0.tgz",
|
||||
"integrity": "sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w=="
|
||||
},
|
||||
"to-regex-range": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-number": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"totalist": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz",
|
||||
"integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="
|
||||
},
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
|
||||
"dev": true
|
||||
},
|
||||
"ws": {
|
||||
"version": "6.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
|
||||
"integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"async-limiter": "~1.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -16,6 +16,9 @@
|
|||
"svelte": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"sirv-cli": "^1.0.0"
|
||||
"lemmy-js-client": "^1.0.16",
|
||||
"node-fetch": "^2.6.1",
|
||||
"sirv-cli": "^1.0.0",
|
||||
"typescript": "^4.0.5"
|
||||
}
|
||||
}
|
||||
|
|
6
public/assets/cookieconsent/cookieconsent.min.css
vendored
Normal file
6
public/assets/cookieconsent/cookieconsent.min.css
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
.cc-window{opacity:1;-webkit-transition:opacity 1s ease;transition:opacity 1s ease}.cc-window.cc-invisible{opacity:0}.cc-animate.cc-revoke{-webkit-transition:transform 1s ease;-webkit-transition:-webkit-transform 1s ease;transition:-webkit-transform 1s ease;transition:transform 1s ease;transition:transform 1s ease,-webkit-transform 1s ease}.cc-animate.cc-revoke.cc-top{-webkit-transform:translateY(-2em);transform:translateY(-2em)}.cc-animate.cc-revoke.cc-bottom{-webkit-transform:translateY(2em);transform:translateY(2em)}.cc-animate.cc-revoke.cc-active.cc-top{-webkit-transform:translateY(0);transform:translateY(0)}.cc-animate.cc-revoke.cc-active.cc-bottom{-webkit-transform:translateY(0);transform:translateY(0)}.cc-revoke:hover{-webkit-transform:translateY(0);transform:translateY(0)}.cc-grower{max-height:0;overflow:hidden;-webkit-transition:max-height 1s;transition:max-height 1s}
|
||||
.cc-revoke,.cc-window{position:fixed;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box;font-family:Helvetica,Calibri,Arial,sans-serif;font-size:16px;line-height:1.5em;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;z-index:9999}.cc-window.cc-static{position:static}.cc-window.cc-floating{padding:2em;max-width:24em;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner{padding:1em 1.8em;width:100%;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.cc-revoke{padding:.5em}.cc-revoke:hover{text-decoration:underline}.cc-header{font-size:18px;font-weight:700}.cc-btn,.cc-close,.cc-link,.cc-revoke{cursor:pointer}.cc-link{opacity:.8;display:inline-block;padding:.2em;text-decoration:underline}.cc-link:hover{opacity:1}.cc-link:active,.cc-link:visited{color:initial}.cc-btn{display:block;padding:.4em .8em;font-size:.9em;font-weight:700;border-width:2px;border-style:solid;text-align:center;white-space:nowrap}.cc-highlight .cc-btn:first-child{background-color:transparent;border-color:transparent}.cc-highlight .cc-btn:first-child:focus,.cc-highlight .cc-btn:first-child:hover{background-color:transparent;text-decoration:underline}.cc-close{display:block;position:absolute;top:.5em;right:.5em;font-size:1.6em;opacity:.9;line-height:.75}.cc-close:focus,.cc-close:hover{opacity:1}
|
||||
.cc-revoke.cc-top{top:0;left:3em;border-bottom-left-radius:.5em;border-bottom-right-radius:.5em}.cc-revoke.cc-bottom{bottom:0;left:3em;border-top-left-radius:.5em;border-top-right-radius:.5em}.cc-revoke.cc-left{left:3em;right:unset}.cc-revoke.cc-right{right:3em;left:unset}.cc-top{top:1em}.cc-left{left:1em}.cc-right{right:1em}.cc-bottom{bottom:1em}.cc-floating>.cc-link{margin-bottom:1em}.cc-floating .cc-message{display:block;margin-bottom:1em}.cc-window.cc-floating .cc-compliance{-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto}.cc-window.cc-banner{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.cc-banner.cc-top{left:0;right:0;top:0}.cc-banner.cc-bottom{left:0;right:0;bottom:0}.cc-banner .cc-message{display:block;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;max-width:100%;margin-right:1em}.cc-compliance{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:justify;align-content:space-between}.cc-floating .cc-compliance>.cc-btn{-webkit-box-flex:1;-ms-flex:1;flex:1}.cc-btn+.cc-btn{margin-left:.5em}
|
||||
@media print{.cc-revoke,.cc-window{display:none}}@media screen and (max-width:900px){.cc-btn{white-space:normal}}@media screen and (max-width:414px) and (orientation:portrait),screen and (max-width:736px) and (orientation:landscape){.cc-window.cc-top{top:0}.cc-window.cc-bottom{bottom:0}.cc-window.cc-banner,.cc-window.cc-floating,.cc-window.cc-left,.cc-window.cc-right{left:0;right:0}.cc-window.cc-banner{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.cc-window.cc-banner .cc-compliance{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.cc-window.cc-floating{max-width:none}.cc-window .cc-message{margin-bottom:1em}.cc-window.cc-banner{-webkit-box-align:unset;-ms-flex-align:unset;align-items:unset}.cc-window.cc-banner .cc-message{margin-right:0}}
|
||||
.cc-floating.cc-theme-classic{padding:1.2em;border-radius:5px}.cc-floating.cc-type-info.cc-theme-classic .cc-compliance{text-align:center;display:inline;-webkit-box-flex:0;-ms-flex:none;flex:none}.cc-theme-classic .cc-btn{border-radius:5px}.cc-theme-classic .cc-btn:last-child{min-width:140px}.cc-floating.cc-type-info.cc-theme-classic .cc-btn{display:inline-block}
|
||||
.cc-theme-edgeless.cc-window{padding:0}.cc-floating.cc-theme-edgeless .cc-message{margin:2em;margin-bottom:1.5em}.cc-banner.cc-theme-edgeless .cc-btn{margin:0;padding:.8em 1.8em;height:100%}.cc-banner.cc-theme-edgeless .cc-message{margin-left:1em}.cc-floating.cc-theme-edgeless .cc-btn+.cc-btn{margin-left:0}
|
1
public/assets/cookieconsent/cookieconsent.min.js
vendored
Normal file
1
public/assets/cookieconsent/cookieconsent.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
4
public/assets/css/font-awesome.min.css
vendored
Normal file
4
public/assets/css/font-awesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
public/assets/fonts/FontAwesome.otf
Normal file
BIN
public/assets/fonts/FontAwesome.otf
Normal file
Binary file not shown.
BIN
public/assets/fonts/fontawesome-webfont.eot
Normal file
BIN
public/assets/fonts/fontawesome-webfont.eot
Normal file
Binary file not shown.
2671
public/assets/fonts/fontawesome-webfont.svg
Normal file
2671
public/assets/fonts/fontawesome-webfont.svg
Normal file
File diff suppressed because it is too large
Load diff
After Width: | Height: | Size: 434 KiB |
BIN
public/assets/fonts/fontawesome-webfont.ttf
Normal file
BIN
public/assets/fonts/fontawesome-webfont.ttf
Normal file
Binary file not shown.
BIN
public/assets/fonts/fontawesome-webfont.woff
Normal file
BIN
public/assets/fonts/fontawesome-webfont.woff
Normal file
Binary file not shown.
BIN
public/assets/fonts/fontawesome-webfont.woff2
Normal file
BIN
public/assets/fonts/fontawesome-webfont.woff2
Normal file
Binary file not shown.
1863
public/assets/javascript/core.js
Normal file
1863
public/assets/javascript/core.js
Normal file
File diff suppressed because it is too large
Load diff
418
public/assets/javascript/editor.js
Normal file
418
public/assets/javascript/editor.js
Normal file
|
@ -0,0 +1,418 @@
|
|||
/**
|
||||
* bbCode control by subBlue design [ www.subBlue.com ]
|
||||
* Includes unixsafe colour palette selector by SHS`
|
||||
*/
|
||||
|
||||
// Startup variables
|
||||
var imageTag = false;
|
||||
var theSelection = false;
|
||||
var bbcodeEnabled = true;
|
||||
|
||||
// Check for Browser & Platform for PC & IE specific bits
|
||||
// More details from: http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
|
||||
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
|
||||
var clientVer = parseInt(navigator.appVersion, 10); // Get browser version
|
||||
|
||||
var is_ie = ((clientPC.indexOf('msie') !== -1) && (clientPC.indexOf('opera') === -1));
|
||||
var is_win = ((clientPC.indexOf('win') !== -1) || (clientPC.indexOf('16bit') !== -1));
|
||||
var baseHeight;
|
||||
|
||||
/**
|
||||
* Fix a bug involving the TextRange object. From
|
||||
* http://www.frostjedi.com/terra/scripts/demo/caretBug.html
|
||||
*/
|
||||
function initInsertions() {
|
||||
var doc;
|
||||
|
||||
if (document.forms[form_name]) {
|
||||
doc = document;
|
||||
} else {
|
||||
doc = opener.document;
|
||||
}
|
||||
|
||||
var textarea = doc.forms[form_name].elements[text_name];
|
||||
|
||||
if (is_ie && typeof(baseHeight) !== 'number') {
|
||||
textarea.focus();
|
||||
baseHeight = doc.selection.createRange().duplicate().boundingHeight;
|
||||
|
||||
if (!document.forms[form_name]) {
|
||||
document.body.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bbstyle
|
||||
*/
|
||||
function bbstyle(bbnumber) {
|
||||
if (bbnumber !== -1) {
|
||||
bbfontstyle(bbtags[bbnumber], bbtags[bbnumber+1]);
|
||||
} else {
|
||||
insert_text('[*]');
|
||||
document.forms[form_name].elements[text_name].focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply bbcodes
|
||||
*/
|
||||
function bbfontstyle(bbopen, bbclose) {
|
||||
theSelection = false;
|
||||
|
||||
var textarea = document.forms[form_name].elements[text_name];
|
||||
|
||||
textarea.focus();
|
||||
|
||||
if ((clientVer >= 4) && is_ie && is_win) {
|
||||
// Get text selection
|
||||
theSelection = document.selection.createRange().text;
|
||||
|
||||
if (theSelection) {
|
||||
// Add tags around selection
|
||||
document.selection.createRange().text = bbopen + theSelection + bbclose;
|
||||
textarea.focus();
|
||||
theSelection = '';
|
||||
return;
|
||||
}
|
||||
} else if (textarea.selectionEnd && (textarea.selectionEnd - textarea.selectionStart > 0)) {
|
||||
mozWrap(textarea, bbopen, bbclose);
|
||||
textarea.focus();
|
||||
theSelection = '';
|
||||
return;
|
||||
}
|
||||
|
||||
//The new position for the cursor after adding the bbcode
|
||||
var caret_pos = getCaretPosition(textarea).start;
|
||||
var new_pos = caret_pos + bbopen.length;
|
||||
|
||||
// Open tag
|
||||
insert_text(bbopen + bbclose);
|
||||
|
||||
// Center the cursor when we don't have a selection
|
||||
// Gecko and proper browsers
|
||||
if (!isNaN(textarea.selectionStart)) {
|
||||
textarea.selectionStart = new_pos;
|
||||
textarea.selectionEnd = new_pos;
|
||||
}
|
||||
// IE
|
||||
else if (document.selection) {
|
||||
var range = textarea.createTextRange();
|
||||
range.move("character", new_pos);
|
||||
range.select();
|
||||
storeCaret(textarea);
|
||||
}
|
||||
|
||||
textarea.focus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert text at position
|
||||
*/
|
||||
function insert_text(text, spaces, popup) {
|
||||
var textarea;
|
||||
|
||||
if (!popup) {
|
||||
textarea = document.forms[form_name].elements[text_name];
|
||||
} else {
|
||||
textarea = opener.document.forms[form_name].elements[text_name];
|
||||
}
|
||||
|
||||
if (spaces) {
|
||||
text = ' ' + text + ' ';
|
||||
}
|
||||
|
||||
// Since IE9, IE also has textarea.selectionStart, but it still needs to be treated the old way.
|
||||
// Therefore we simply add a !is_ie here until IE fixes the text-selection completely.
|
||||
if (!isNaN(textarea.selectionStart) && !is_ie) {
|
||||
var sel_start = textarea.selectionStart;
|
||||
var sel_end = textarea.selectionEnd;
|
||||
|
||||
mozWrap(textarea, text, '');
|
||||
textarea.selectionStart = sel_start + text.length;
|
||||
textarea.selectionEnd = sel_end + text.length;
|
||||
} else if (textarea.createTextRange && textarea.caretPos) {
|
||||
if (baseHeight !== textarea.caretPos.boundingHeight) {
|
||||
textarea.focus();
|
||||
storeCaret(textarea);
|
||||
}
|
||||
|
||||
var caret_pos = textarea.caretPos;
|
||||
caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) === ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
|
||||
} else {
|
||||
textarea.value = textarea.value + text;
|
||||
}
|
||||
|
||||
if (!popup) {
|
||||
textarea.focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add inline attachment at position
|
||||
*/
|
||||
function attachInline(index, filename) {
|
||||
insert_text('[attachment=' + index + ']' + filename + '[/attachment]');
|
||||
document.forms[form_name].elements[text_name].focus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add quote text to message
|
||||
*/
|
||||
function addquote(post_id, username, l_wrote, attributes) {
|
||||
var message_name = 'message_' + post_id;
|
||||
var theSelection = '';
|
||||
var divarea = false;
|
||||
var i;
|
||||
|
||||
if (l_wrote === undefined) {
|
||||
// Backwards compatibility
|
||||
l_wrote = 'wrote';
|
||||
}
|
||||
if (typeof attributes !== 'object') {
|
||||
attributes = {};
|
||||
}
|
||||
|
||||
if (document.all) {
|
||||
divarea = document.all[message_name];
|
||||
} else {
|
||||
divarea = document.getElementById(message_name);
|
||||
}
|
||||
|
||||
// Get text selection - not only the post content :(
|
||||
// IE9 must use the document.selection method but has the *.getSelection so we just force no IE
|
||||
if (window.getSelection && !is_ie && !window.opera) {
|
||||
theSelection = window.getSelection().toString();
|
||||
} else if (document.getSelection && !is_ie) {
|
||||
theSelection = document.getSelection();
|
||||
} else if (document.selection) {
|
||||
theSelection = document.selection.createRange().text;
|
||||
}
|
||||
|
||||
if (theSelection === '' || typeof theSelection === 'undefined' || theSelection === null) {
|
||||
if (divarea.innerHTML) {
|
||||
theSelection = divarea.innerHTML.replace(/<br>/ig, '\n');
|
||||
theSelection = theSelection.replace(/<br\/>/ig, '\n');
|
||||
theSelection = theSelection.replace(/<\;/ig, '<');
|
||||
theSelection = theSelection.replace(/>\;/ig, '>');
|
||||
theSelection = theSelection.replace(/&\;/ig, '&');
|
||||
theSelection = theSelection.replace(/ \;/ig, ' ');
|
||||
} else if (document.all) {
|
||||
theSelection = divarea.innerText;
|
||||
} else if (divarea.textContent) {
|
||||
theSelection = divarea.textContent;
|
||||
} else if (divarea.firstChild.nodeValue) {
|
||||
theSelection = divarea.firstChild.nodeValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (theSelection) {
|
||||
if (bbcodeEnabled) {
|
||||
attributes.author = username;
|
||||
insert_text(generateQuote(theSelection, attributes));
|
||||
} else {
|
||||
insert_text(username + ' ' + l_wrote + ':' + '\n');
|
||||
var lines = split_lines(theSelection);
|
||||
for (i = 0; i < lines.length; i++) {
|
||||
insert_text('> ' + lines[i] + '\n');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a quote block for given text
|
||||
*
|
||||
* Possible attributes:
|
||||
* - author: author's name (usually a username)
|
||||
* - post_id: post_id of the post being quoted
|
||||
* - user_id: user_id of the user being quoted
|
||||
* - time: timestamp of the original message
|
||||
*
|
||||
* @param {!string} text Quote's text
|
||||
* @param {!Object} attributes Quote's attributes
|
||||
* @return {!string} Quote block to be used in a new post/text
|
||||
*/
|
||||
function generateQuote(text, attributes) {
|
||||
text = text.replace(/^\s+/, '').replace(/\s+$/, '');
|
||||
var quote = '[quote';
|
||||
if (attributes.author) {
|
||||
// Add the author as the BBCode's default attribute
|
||||
quote += '=' + formatAttributeValue(attributes.author);
|
||||
delete attributes.author;
|
||||
}
|
||||
for (var name in attributes) {
|
||||
if (attributes.hasOwnProperty(name)) {
|
||||
var value = attributes[name];
|
||||
quote += ' ' + name + '=' + formatAttributeValue(value.toString());
|
||||
}
|
||||
}
|
||||
quote += ']';
|
||||
var newline = ((quote + text + '[/quote]').length > 80 || text.indexOf('\n') > -1) ? '\n' : '';
|
||||
quote += newline + text + newline + '[/quote]';
|
||||
|
||||
return quote;
|
||||
}
|
||||
|
||||
/**
|
||||
* Format given string to be used as an attribute value
|
||||
*
|
||||
* Will return the string as-is if it can be used in a BBCode without quotes. Otherwise,
|
||||
* it will use either single- or double- quotes depending on whichever requires less escaping.
|
||||
* Quotes and backslashes are escaped with backslashes where necessary
|
||||
*
|
||||
* @param {!string} str Original string
|
||||
* @return {!string} Same string if possible, escaped string within quotes otherwise
|
||||
*/
|
||||
function formatAttributeValue(str) {
|
||||
if (!/[ "'\\\]]/.test(str)) {
|
||||
// Return as-is if it contains none of: space, ' " \ or ]
|
||||
return str;
|
||||
}
|
||||
var singleQuoted = "'" + str.replace(/[\\']/g, '\\$&') + "'",
|
||||
doubleQuoted = '"' + str.replace(/[\\"]/g, '\\$&') + '"';
|
||||
|
||||
return (singleQuoted.length < doubleQuoted.length) ? singleQuoted : doubleQuoted;
|
||||
}
|
||||
|
||||
function split_lines(text) {
|
||||
var lines = text.split('\n');
|
||||
var splitLines = new Array();
|
||||
var j = 0;
|
||||
var i;
|
||||
|
||||
for(i = 0; i < lines.length; i++) {
|
||||
if (lines[i].length <= 80) {
|
||||
splitLines[j] = lines[i];
|
||||
j++;
|
||||
} else {
|
||||
var line = lines[i];
|
||||
var splitAt;
|
||||
do {
|
||||
splitAt = line.indexOf(' ', 80);
|
||||
|
||||
if (splitAt === -1) {
|
||||
splitLines[j] = line;
|
||||
j++;
|
||||
} else {
|
||||
splitLines[j] = line.substring(0, splitAt);
|
||||
line = line.substring(splitAt);
|
||||
j++;
|
||||
}
|
||||
}
|
||||
while(splitAt !== -1);
|
||||
}
|
||||
}
|
||||
return splitLines;
|
||||
}
|
||||
|
||||
/**
|
||||
* From http://www.massless.org/mozedit/
|
||||
*/
|
||||
function mozWrap(txtarea, open, close) {
|
||||
var selLength = (typeof(txtarea.textLength) === 'undefined') ? txtarea.value.length : txtarea.textLength;
|
||||
var selStart = txtarea.selectionStart;
|
||||
var selEnd = txtarea.selectionEnd;
|
||||
var scrollTop = txtarea.scrollTop;
|
||||
|
||||
var s1 = (txtarea.value).substring(0,selStart);
|
||||
var s2 = (txtarea.value).substring(selStart, selEnd);
|
||||
var s3 = (txtarea.value).substring(selEnd, selLength);
|
||||
|
||||
txtarea.value = s1 + open + s2 + close + s3;
|
||||
txtarea.selectionStart = selStart + open.length;
|
||||
txtarea.selectionEnd = selEnd + open.length;
|
||||
txtarea.focus();
|
||||
txtarea.scrollTop = scrollTop;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert at Caret position. Code from
|
||||
* http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
|
||||
*/
|
||||
function storeCaret(textEl) {
|
||||
if (textEl.createTextRange && document.selection) {
|
||||
textEl.caretPos = document.selection.createRange().duplicate();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Caret Position object
|
||||
*/
|
||||
function caretPosition() {
|
||||
var start = null;
|
||||
var end = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the caret position in an textarea
|
||||
*/
|
||||
function getCaretPosition(txtarea) {
|
||||
var caretPos = new caretPosition();
|
||||
|
||||
// simple Gecko/Opera way
|
||||
if (txtarea.selectionStart || txtarea.selectionStart === 0) {
|
||||
caretPos.start = txtarea.selectionStart;
|
||||
caretPos.end = txtarea.selectionEnd;
|
||||
}
|
||||
// dirty and slow IE way
|
||||
else if (document.selection) {
|
||||
// get current selection
|
||||
var range = document.selection.createRange();
|
||||
|
||||
// a new selection of the whole textarea
|
||||
var range_all = document.body.createTextRange();
|
||||
range_all.moveToElementText(txtarea);
|
||||
|
||||
// calculate selection start point by moving beginning of range_all to beginning of range
|
||||
var sel_start;
|
||||
for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++) {
|
||||
range_all.moveStart('character', 1);
|
||||
}
|
||||
|
||||
txtarea.sel_start = sel_start;
|
||||
|
||||
// we ignore the end value for IE, this is already dirty enough and we don't need it
|
||||
caretPos.start = txtarea.sel_start;
|
||||
caretPos.end = txtarea.sel_start;
|
||||
}
|
||||
|
||||
return caretPos;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow to use tab character when typing code
|
||||
* Keep indentation of last line of code when typing code
|
||||
*/
|
||||
(function($) {
|
||||
$(document).ready(function() {
|
||||
var doc, textarea;
|
||||
|
||||
// find textarea, make sure browser supports necessary functions
|
||||
if (document.forms[form_name]) {
|
||||
doc = document;
|
||||
} else {
|
||||
doc = opener.document;
|
||||
}
|
||||
|
||||
if (!doc.forms[form_name]) {
|
||||
return;
|
||||
}
|
||||
|
||||
textarea = doc.forms[form_name].elements[text_name];
|
||||
|
||||
phpbb.applyCodeEditor(textarea);
|
||||
if ($('#attach-panel').length) {
|
||||
phpbb.showDragNDrop(textarea);
|
||||
}
|
||||
|
||||
$('textarea').on('keydown', function (e) {
|
||||
if (e.which === 13 && (e.metaKey || e.ctrlKey)) {
|
||||
$(this).closest('form').find(':submit').click();
|
||||
}
|
||||
});
|
||||
});
|
||||
})(jQuery);
|
||||
|
615
public/assets/javascript/installer.js
Normal file
615
public/assets/javascript/installer.js
Normal file
|
@ -0,0 +1,615 @@
|
|||
/**
|
||||
* Installer's AJAX frontend handler
|
||||
*/
|
||||
|
||||
(function($) { // Avoid conflicts with other libraries
|
||||
'use strict';
|
||||
|
||||
// Installer variables
|
||||
var pollTimer = null;
|
||||
var nextReadPosition = 0;
|
||||
var progressBarTriggered = false;
|
||||
var progressTimer = null;
|
||||
var currentProgress = 0;
|
||||
var refreshRequested = false;
|
||||
var transmissionOver = false;
|
||||
var statusCount = 0;
|
||||
|
||||
// Template related variables
|
||||
var $contentWrapper = $('.install-body').find('.main');
|
||||
|
||||
// Intercept form submits
|
||||
interceptFormSubmit($('#install_install'));
|
||||
|
||||
/**
|
||||
* Creates an XHR object
|
||||
*
|
||||
* jQuery cannot be used as the response is streamed, and
|
||||
* as of now, jQuery does not provide access to the response until
|
||||
* the connection is not closed.
|
||||
*
|
||||
* @return XMLHttpRequest
|
||||
*/
|
||||
function createXhrObject() {
|
||||
return new XMLHttpRequest();
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays error, warning and log messages
|
||||
*
|
||||
* @param type
|
||||
* @param messages
|
||||
*/
|
||||
function addMessage(type, messages) {
|
||||
// Get message containers
|
||||
var $errorContainer = $('#error-container');
|
||||
var $warningContainer = $('#warning-container');
|
||||
var $logContainer = $('#log-container');
|
||||
|
||||
var $title, $description, $msgElement, arraySize = messages.length;
|
||||
for (var i = 0; i < arraySize; i++) {
|
||||
$msgElement = $('<div />');
|
||||
$title = $('<strong />');
|
||||
$title.text(messages[i].title);
|
||||
$msgElement.append($title);
|
||||
|
||||
if (messages[i].hasOwnProperty('description')) {
|
||||
$description = $('<p />');
|
||||
$description.html(messages[i].description);
|
||||
$msgElement.append($description);
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case 'error':
|
||||
$msgElement.addClass('errorbox');
|
||||
$errorContainer.append($msgElement);
|
||||
break;
|
||||
case 'warning':
|
||||
$msgElement.addClass('warningbox');
|
||||
$warningContainer.append($msgElement);
|
||||
break;
|
||||
case 'log':
|
||||
$msgElement.addClass('log');
|
||||
$logContainer.prepend($msgElement);
|
||||
$logContainer.addClass('show_log_container');
|
||||
break;
|
||||
case 'success':
|
||||
$msgElement.addClass('successbox');
|
||||
$errorContainer.prepend($msgElement);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a download box
|
||||
*/
|
||||
function addDownloadBox(downloadArray)
|
||||
{
|
||||
var $downloadContainer = $('#download-wrapper');
|
||||
var $downloadBox, $title, $content, $link;
|
||||
|
||||
for (var i = 0; i < downloadArray.length; i++) {
|
||||
$downloadBox = $('<div />');
|
||||
$downloadBox.addClass('download-box');
|
||||
|
||||
$title = $('<strong />');
|
||||
$title.text(downloadArray[i].title);
|
||||
$downloadBox.append($title);
|
||||
|
||||
if (downloadArray[i].hasOwnProperty('msg')) {
|
||||
$content = $('<p />');
|
||||
$content.text(downloadArray[i].msg);
|
||||
$downloadBox.append($content);
|
||||
}
|
||||
|
||||
$link = $('<a />');
|
||||
$link.addClass('button1');
|
||||
$link.attr('href', downloadArray[i].href);
|
||||
$link.text(downloadArray[i].download);
|
||||
$downloadBox.append($link);
|
||||
|
||||
$downloadContainer.append($downloadBox);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Render update files' status
|
||||
*/
|
||||
function addUpdateFileStatus(fileStatus)
|
||||
{
|
||||
var $statusContainer = $('#file-status-wrapper');
|
||||
$statusContainer.html(fileStatus);
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a form from the response
|
||||
*
|
||||
* @param formHtml
|
||||
*/
|
||||
function addForm(formHtml) {
|
||||
var $formContainer = $('#form-wrapper');
|
||||
$formContainer.html(formHtml);
|
||||
var $form = $('#install_install');
|
||||
interceptFormSubmit($form);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles navigation status updates
|
||||
*
|
||||
* @param navObj
|
||||
*/
|
||||
function updateNavbarStatus(navObj) {
|
||||
var navID, $stage, $stageListItem, $active;
|
||||
$active = $('#activemenu');
|
||||
|
||||
if (navObj.hasOwnProperty('finished')) {
|
||||
// This should be an Array
|
||||
var navItems = navObj.finished;
|
||||
|
||||
for (var i = 0; i < navItems.length; i++) {
|
||||
navID = 'installer-stage-' + navItems[i];
|
||||
$stage = $('#' + navID);
|
||||
$stageListItem = $stage.parent();
|
||||
|
||||
if ($active.length && $active.is($stageListItem)) {
|
||||
$active.removeAttr('id');
|
||||
}
|
||||
|
||||
$stage.addClass('completed');
|
||||
}
|
||||
}
|
||||
|
||||
if (navObj.hasOwnProperty('active')) {
|
||||
navID = 'installer-stage-' + navObj.active;
|
||||
$stage = $('#' + navID);
|
||||
$stageListItem = $stage.parent();
|
||||
|
||||
if ($active.length && !$active.is($stageListItem)) {
|
||||
$active.removeAttr('id');
|
||||
}
|
||||
|
||||
$stageListItem.attr('id', 'activemenu');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders progress bar
|
||||
*
|
||||
* @param progressObject
|
||||
*/
|
||||
function setProgress(progressObject) {
|
||||
var $statusText, $progressBar, $progressText, $progressFiller, $progressFillerText;
|
||||
|
||||
if (progressObject.task_name.length) {
|
||||
if (!progressBarTriggered) {
|
||||
// Create progress bar
|
||||
var $progressBarWrapper = $('#progress-bar-container');
|
||||
|
||||
// Create progress bar elements
|
||||
$progressBar = $('<div />');
|
||||
$progressBar.attr('id', 'progress-bar');
|
||||
$progressText = $('<p />');
|
||||
$progressText.attr('id', 'progress-bar-text');
|
||||
$progressFiller = $('<div />');
|
||||
$progressFiller.attr('id', 'progress-bar-filler');
|
||||
$progressFillerText = $('<p />');
|
||||
$progressFillerText.attr('id', 'progress-bar-filler-text');
|
||||
|
||||
$statusText = $('<p />');
|
||||
$statusText.attr('id', 'progress-status-text');
|
||||
|
||||
$progressFiller.append($progressFillerText);
|
||||
$progressBar.append($progressText);
|
||||
$progressBar.append($progressFiller);
|
||||
|
||||
$progressBarWrapper.append($statusText);
|
||||
$progressBarWrapper.append($progressBar);
|
||||
|
||||
$progressFillerText.css('width', $progressBar.width());
|
||||
|
||||
progressBarTriggered = true;
|
||||
} else if (progressObject.hasOwnProperty('restart')) {
|
||||
clearInterval(progressTimer);
|
||||
|
||||
$progressFiller = $('#progress-bar-filler');
|
||||
$progressFillerText = $('#progress-bar-filler-text');
|
||||
$progressText = $('#progress-bar-text');
|
||||
$statusText = $('#progress-status-text');
|
||||
|
||||
$progressText.text('0%');
|
||||
$progressFillerText.text('0%');
|
||||
$progressFiller.css('width', '0%');
|
||||
|
||||
currentProgress = 0;
|
||||
} else {
|
||||
$statusText = $('#progress-status-text');
|
||||
}
|
||||
|
||||
// Update progress bar
|
||||
$statusText.text(progressObject.task_name + '…');
|
||||
incrementProgressBar(Math.round(progressObject.task_num / progressObject.task_count * 100));
|
||||
}
|
||||
}
|
||||
|
||||
// Set cookies
|
||||
function setCookies(cookies) {
|
||||
var cookie;
|
||||
|
||||
for (var i = 0; i < cookies.length; i++) {
|
||||
// Set cookie name and value
|
||||
cookie = encodeURIComponent(cookies[i].name) + '=' + encodeURIComponent(cookies[i].value);
|
||||
// Set path
|
||||
cookie += '; path=/';
|
||||
document.cookie = cookie;
|
||||
}
|
||||
}
|
||||
|
||||
// Redirects user
|
||||
function redirect(url, use_ajax) {
|
||||
if (use_ajax) {
|
||||
resetPolling();
|
||||
|
||||
var xhReq = createXhrObject();
|
||||
xhReq.open('GET', url, true);
|
||||
xhReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
xhReq.send();
|
||||
|
||||
startPolling(xhReq);
|
||||
} else {
|
||||
window.location.href = url;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse messages from the response object
|
||||
*
|
||||
* @param messageJSON
|
||||
*/
|
||||
function parseMessage(messageJSON) {
|
||||
$('#loading_indicator').css('display', 'none');
|
||||
var responseObject;
|
||||
|
||||
try {
|
||||
responseObject = JSON.parse(messageJSON);
|
||||
} catch (err) {
|
||||
if (window.console) {
|
||||
console.log('Failed to parse JSON object\n\nMessage: ' + err.message + '\n\nServer Response: ' + messageJSON);
|
||||
} else {
|
||||
alert('Failed to parse JSON object\n\nMessage: ' + err.message + '\n\nServer Response: ' + messageJSON);
|
||||
}
|
||||
|
||||
resetPolling();
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse object
|
||||
if (responseObject.hasOwnProperty('errors')) {
|
||||
addMessage('error', responseObject.errors);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('warnings')) {
|
||||
addMessage('warning', responseObject.warnings);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('logs')) {
|
||||
addMessage('log', responseObject.logs);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('success')) {
|
||||
addMessage('success', responseObject.success);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('form')) {
|
||||
addForm(responseObject.form);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('progress')) {
|
||||
setProgress(responseObject.progress);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('download')) {
|
||||
addDownloadBox(responseObject.download);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('file_status')) {
|
||||
addUpdateFileStatus(responseObject.file_status);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('nav')) {
|
||||
updateNavbarStatus(responseObject.nav);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('cookies')) {
|
||||
setCookies(responseObject.cookies);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('refresh')) {
|
||||
refreshRequested = true;
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('redirect')) {
|
||||
redirect(responseObject.redirect.url, responseObject.redirect.use_ajax);
|
||||
}
|
||||
|
||||
if (responseObject.hasOwnProperty('over')) {
|
||||
if (responseObject.over) {
|
||||
transmissionOver = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes status data
|
||||
*
|
||||
* @param status
|
||||
*/
|
||||
function processTimeoutResponse(status) {
|
||||
if (statusCount === 12) { // 1 minute hard cap
|
||||
status = 'fail';
|
||||
}
|
||||
|
||||
if (status === 'continue') {
|
||||
refreshRequested = false;
|
||||
doRefresh();
|
||||
} else if (status === 'running') {
|
||||
statusCount++;
|
||||
$('#loading_indicator').css('display', 'block');
|
||||
setTimeout(queryInstallerStatus, 5000);
|
||||
} else {
|
||||
$('#loading_indicator').css('display', 'none');
|
||||
addMessage('error',
|
||||
[{
|
||||
title: installLang.title,
|
||||
description: installLang.msg
|
||||
}]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Queries the installer's status
|
||||
*/
|
||||
function queryInstallerStatus() {
|
||||
var url = $(location).attr('pathname');
|
||||
var lookUp = 'install/app.php';
|
||||
var position = url.indexOf(lookUp);
|
||||
|
||||
if (position === -1) {
|
||||
lookUp = 'install';
|
||||
position = url.indexOf(lookUp);
|
||||
|
||||
if (position === -1) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
url = url.substring(0, position) + lookUp + '/installer/status';
|
||||
$.getJSON(url, function(data) {
|
||||
processTimeoutResponse(data.status);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Process updates in streamed response
|
||||
*
|
||||
* @param xhReq XHR object
|
||||
*/
|
||||
function pollContent(xhReq) {
|
||||
var messages = xhReq.responseText;
|
||||
var msgSeparator = '}\n\n';
|
||||
var unprocessed, messageEndIndex, endOfMessageIndex, message;
|
||||
|
||||
do {
|
||||
unprocessed = messages.substring(nextReadPosition);
|
||||
messageEndIndex = unprocessed.indexOf(msgSeparator);
|
||||
|
||||
if (messageEndIndex !== -1) {
|
||||
endOfMessageIndex = messageEndIndex + msgSeparator.length;
|
||||
message = unprocessed.substring(0, endOfMessageIndex);
|
||||
parseMessage($.trim(message));
|
||||
nextReadPosition += endOfMessageIndex;
|
||||
}
|
||||
} while (messageEndIndex !== -1);
|
||||
|
||||
if (xhReq.readyState === 4) {
|
||||
$('#loading_indicator').css('display', 'none');
|
||||
resetPolling();
|
||||
|
||||
var timeoutDetected = !transmissionOver;
|
||||
|
||||
if (refreshRequested) {
|
||||
refreshRequested = false;
|
||||
doRefresh();
|
||||
}
|
||||
|
||||
if (timeoutDetected) {
|
||||
statusCount = 0;
|
||||
queryInstallerStatus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Animates the progress bar
|
||||
*
|
||||
* @param $progressText
|
||||
* @param $progressFiller
|
||||
* @param $progressFillerText
|
||||
* @param progressLimit
|
||||
*/
|
||||
function incrementFiller($progressText, $progressFiller, $progressFillerText, progressLimit) {
|
||||
if (currentProgress >= progressLimit || currentProgress >= 100) {
|
||||
clearInterval(progressTimer);
|
||||
return;
|
||||
}
|
||||
|
||||
var $progressBar = $('#progress-bar');
|
||||
|
||||
currentProgress++;
|
||||
$progressFillerText.css('width', $progressBar.width());
|
||||
$progressFillerText.text(currentProgress + '%');
|
||||
$progressText.text(currentProgress + '%');
|
||||
$progressFiller.css('width', currentProgress + '%');
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper function for progress bar rendering and animating
|
||||
*
|
||||
* @param progressLimit
|
||||
*/
|
||||
function incrementProgressBar(progressLimit) {
|
||||
var $progressFiller = $('#progress-bar-filler');
|
||||
var $progressFillerText = $('#progress-bar-filler-text');
|
||||
var $progressText = $('#progress-bar-text');
|
||||
var progressStart = $progressFiller.width() / $progressFiller.offsetParent().width() * 100;
|
||||
currentProgress = Math.floor(progressStart);
|
||||
|
||||
clearInterval(progressTimer);
|
||||
progressTimer = setInterval(function() {
|
||||
incrementFiller($progressText, $progressFiller, $progressFillerText, progressLimit);
|
||||
}, 10);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the polling timer
|
||||
*/
|
||||
function resetPolling() {
|
||||
clearInterval(pollTimer);
|
||||
nextReadPosition = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets up timer for processing the streamed HTTP response
|
||||
*
|
||||
* @param xhReq
|
||||
*/
|
||||
function startPolling(xhReq) {
|
||||
resetPolling();
|
||||
transmissionOver = false;
|
||||
pollTimer = setInterval(function () {
|
||||
pollContent(xhReq);
|
||||
}, 250);
|
||||
}
|
||||
|
||||
/**
|
||||
* Refresh page
|
||||
*/
|
||||
function doRefresh() {
|
||||
resetPolling();
|
||||
|
||||
var xhReq = createXhrObject();
|
||||
xhReq.open('GET', $(location).attr('pathname'), true);
|
||||
xhReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
xhReq.send();
|
||||
|
||||
startPolling(xhReq);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the AJAX UI layout
|
||||
*/
|
||||
function setupAjaxLayout() {
|
||||
progressBarTriggered = false;
|
||||
|
||||
// Clear content
|
||||
$contentWrapper.html('');
|
||||
|
||||
var $header = $('<div />');
|
||||
$header.attr('id', 'header-container');
|
||||
$contentWrapper.append($header);
|
||||
|
||||
var $description = $('<div />');
|
||||
$description.attr('id', 'description-container');
|
||||
$contentWrapper.append($description);
|
||||
|
||||
var $errorContainer = $('<div />');
|
||||
$errorContainer.attr('id', 'error-container');
|
||||
$contentWrapper.append($errorContainer);
|
||||
|
||||
var $warningContainer = $('<div />');
|
||||
$warningContainer.attr('id', 'warning-container');
|
||||
$contentWrapper.append($warningContainer);
|
||||
|
||||
var $progressContainer = $('<div />');
|
||||
$progressContainer.attr('id', 'progress-bar-container');
|
||||
$contentWrapper.append($progressContainer);
|
||||
|
||||
var $logContainer = $('<div />');
|
||||
$logContainer.attr('id', 'log-container');
|
||||
$contentWrapper.append($logContainer);
|
||||
|
||||
var $installerContentWrapper = $('<div />');
|
||||
$installerContentWrapper.attr('id', 'content-container');
|
||||
$contentWrapper.append($installerContentWrapper);
|
||||
|
||||
var $installerDownloadWrapper = $('<div />');
|
||||
$installerDownloadWrapper.attr('id', 'download-wrapper');
|
||||
$installerContentWrapper.append($installerDownloadWrapper);
|
||||
|
||||
var $updaterFileStatusWrapper = $('<div />');
|
||||
$updaterFileStatusWrapper.attr('id', 'file-status-wrapper');
|
||||
$installerContentWrapper.append($updaterFileStatusWrapper);
|
||||
|
||||
var $formWrapper = $('<div />');
|
||||
$formWrapper.attr('id', 'form-wrapper');
|
||||
$installerContentWrapper.append($formWrapper);
|
||||
|
||||
var $spinner = $('<div />');
|
||||
$spinner.attr('id', 'loading_indicator');
|
||||
$spinner.html(' ');
|
||||
$contentWrapper.append($spinner);
|
||||
}
|
||||
|
||||
// Submits a form
|
||||
function submitForm($form, $submitBtn) {
|
||||
$form.css('display', 'none');
|
||||
|
||||
var xhReq = createXhrObject();
|
||||
xhReq.open('POST', $form.attr('action'), true);
|
||||
xhReq.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
|
||||
xhReq.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
|
||||
xhReq.send(getFormFields($form, $submitBtn));
|
||||
|
||||
// Disable language selector
|
||||
$('#language_selector :input, label').css('display', 'none');
|
||||
|
||||
// Clear content
|
||||
setupAjaxLayout();
|
||||
$('#loading_indicator').css('display', 'block');
|
||||
|
||||
startPolling(xhReq);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add submit button to the POST information
|
||||
*
|
||||
* @param $form
|
||||
* @param $submitBtn
|
||||
*
|
||||
* @returns {*}
|
||||
*/
|
||||
function getFormFields($form, $submitBtn) {
|
||||
var formData = $form.serialize();
|
||||
formData += ((formData.length) ? '&' : '') + encodeURIComponent($submitBtn.attr('name')) + '=';
|
||||
formData += encodeURIComponent($submitBtn.attr('value'));
|
||||
|
||||
return formData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Intercept form submit events and determine the submit button used
|
||||
*
|
||||
* @param $form
|
||||
*/
|
||||
function interceptFormSubmit($form) {
|
||||
if (!$form.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
$form.find(':submit').bind('click', function (event) {
|
||||
event.preventDefault();
|
||||
submitForm($form, $(this));
|
||||
});
|
||||
}
|
||||
})(jQuery); // Avoid conflicts with other libraries
|
2
public/assets/javascript/jquery-3.5.1.min.js
vendored
Normal file
2
public/assets/javascript/jquery-3.5.1.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
714
public/assets/javascript/plupload.js
Normal file
714
public/assets/javascript/plupload.js
Normal file
|
@ -0,0 +1,714 @@
|
|||
/* global phpbb, plupload, attachInline */
|
||||
|
||||
plupload.addI18n(phpbb.plupload.i18n);
|
||||
phpbb.plupload.ids = [];
|
||||
|
||||
(function($) { // Avoid conflicts with other libraries
|
||||
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Set up the uploader.
|
||||
*/
|
||||
phpbb.plupload.initialize = function() {
|
||||
// Initialize the Plupload uploader.
|
||||
phpbb.plupload.uploader.init();
|
||||
|
||||
// Set attachment data.
|
||||
phpbb.plupload.setData(phpbb.plupload.data);
|
||||
phpbb.plupload.updateMultipartParams(phpbb.plupload.getSerializedData());
|
||||
|
||||
// Only execute if Plupload initialized successfully.
|
||||
phpbb.plupload.uploader.bind('Init', function() {
|
||||
phpbb.plupload.form = $(phpbb.plupload.config.form_hook)[0];
|
||||
let $attachRowTemplate = $('#attach-row-tpl');
|
||||
$attachRowTemplate.removeClass('attach-row-tpl');
|
||||
phpbb.plupload.rowTpl = $attachRowTemplate[0].outerHTML;
|
||||
|
||||
// Hide the basic upload panel and remove the attach row template.
|
||||
$('#attach-row-tpl, #attach-panel-basic').remove();
|
||||
// Show multi-file upload options.
|
||||
$('#attach-panel-multi').show();
|
||||
});
|
||||
|
||||
phpbb.plupload.uploader.bind('PostInit', function() {
|
||||
// Point out the drag-and-drop zone if it's supported.
|
||||
if (phpbb.plupload.uploader.features.dragdrop) {
|
||||
$('#drag-n-drop-message').show();
|
||||
}
|
||||
|
||||
// Ensure "Add files" button position is correctly calculated.
|
||||
if ($('#attach-panel-multi').is(':visible')) {
|
||||
phpbb.plupload.uploader.refresh();
|
||||
}
|
||||
$('[data-subpanel="attach-panel"]').one('click', function() {
|
||||
phpbb.plupload.uploader.refresh();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Unsets all elements in the object uploader.settings.multipart_params whose keys
|
||||
* begin with 'attachment_data['
|
||||
*/
|
||||
phpbb.plupload.clearParams = function() {
|
||||
var obj = phpbb.plupload.uploader.settings.multipart_params;
|
||||
for (var key in obj) {
|
||||
if (!obj.hasOwnProperty(key) || key.indexOf('attachment_data[') !== 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
delete phpbb.plupload.uploader.settings.multipart_params[key];
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Update uploader.settings.multipart_params object with new data.
|
||||
*
|
||||
* @param {object} obj
|
||||
*/
|
||||
phpbb.plupload.updateMultipartParams = function(obj) {
|
||||
var settings = phpbb.plupload.uploader.settings;
|
||||
settings.multipart_params = $.extend(settings.multipart_params, obj);
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert the array of attachment objects into an object that PHP would expect as POST data.
|
||||
*
|
||||
* @returns {object} An object in the form 'attachment_data[i][key]': value as
|
||||
* expected by the server
|
||||
*/
|
||||
phpbb.plupload.getSerializedData = function() {
|
||||
var obj = {};
|
||||
for (var i = 0; i < phpbb.plupload.data.length; i++) {
|
||||
var datum = phpbb.plupload.data[i];
|
||||
for (var key in datum) {
|
||||
if (!datum.hasOwnProperty(key)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
obj['attachment_data[' + i + '][' + key + ']'] = datum[key];
|
||||
}
|
||||
}
|
||||
|
||||
// Insert form data
|
||||
var $pluploadForm = $(phpbb.plupload.config.form_hook).first();
|
||||
obj.creation_time = $pluploadForm.find('input[type=hidden][name="creation_time"]').val();
|
||||
obj.form_token = $pluploadForm.find('input[type=hidden][name="form_token"]').val();
|
||||
|
||||
return obj;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the index from the phpbb.plupload.data array where the given
|
||||
* attachment id appears.
|
||||
*
|
||||
* @param {int} attachId The attachment id of the file.
|
||||
* @returns {bool|int} Index of the file if exists, otherwise false.
|
||||
*/
|
||||
phpbb.plupload.getIndex = function(attachId) {
|
||||
var index = $.inArray(Number(attachId), phpbb.plupload.ids);
|
||||
return (index !== -1) ? index : false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set the data in phpbb.plupload.data and phpbb.plupload.ids arrays.
|
||||
*
|
||||
* @param {Array} data Array containing the new data to use. In the form of
|
||||
* array(index => object(property: value). Requires attach_id to be one of the object properties.
|
||||
*/
|
||||
phpbb.plupload.setData = function(data) {
|
||||
// Make sure that the array keys are reset.
|
||||
phpbb.plupload.ids = phpbb.plupload.data = [];
|
||||
phpbb.plupload.data = data;
|
||||
|
||||
for (var i = 0; i < data.length; i++) {
|
||||
phpbb.plupload.ids.push(Number(data[i].attach_id));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Update the attachment data in the HTML and the phpbb & phpbb.plupload objects.
|
||||
*
|
||||
* @param {Array} data Array containing the new data to use.
|
||||
* @param {string} action The action that required the update. Used to update the inline attachment bbcodes.
|
||||
* @param {int} index The index from phpbb.plupload_ids that was affected by the action.
|
||||
* @param {Array} downloadUrl Optional array of download urls to update.
|
||||
*/
|
||||
phpbb.plupload.update = function(data, action, index, downloadUrl) {
|
||||
|
||||
phpbb.plupload.updateBbcode(action, index);
|
||||
phpbb.plupload.setData(data);
|
||||
phpbb.plupload.updateRows(downloadUrl);
|
||||
phpbb.plupload.clearParams();
|
||||
phpbb.plupload.updateMultipartParams(phpbb.plupload.getSerializedData());
|
||||
};
|
||||
|
||||
/**
|
||||
* Update the relevant elements and hidden data for all attachments.
|
||||
*
|
||||
* @param {Array} downloadUrl Optional array of download urls to update.
|
||||
*/
|
||||
phpbb.plupload.updateRows = function(downloadUrl) {
|
||||
for (var i = 0; i < phpbb.plupload.ids.length; i++) {
|
||||
phpbb.plupload.updateRow(i, downloadUrl);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Insert a row for a new attachment. This expects an HTML snippet in the HTML
|
||||
* using the id "attach-row-tpl" to be present. This snippet is cloned and the
|
||||
* data for the file inserted into it. The row is then appended or prepended to
|
||||
* #file-list based on the attach_order setting.
|
||||
*
|
||||
* @param {object} file Plupload file object for the new attachment.
|
||||
*/
|
||||
phpbb.plupload.insertRow = function(file) {
|
||||
var row = $(phpbb.plupload.rowTpl);
|
||||
|
||||
row.attr('id', file.id);
|
||||
row.find('.file-name').html(plupload.xmlEncode(file.name));
|
||||
row.find('.file-size').html(plupload.formatSize(file.size));
|
||||
|
||||
if (phpbb.plupload.order === 'desc') {
|
||||
$('#file-list').prepend(row);
|
||||
} else {
|
||||
$('#file-list').append(row);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Update the relevant elements and hidden data for an attachment.
|
||||
*
|
||||
* @param {int} index The index from phpbb.plupload.ids of the attachment to edit.
|
||||
* @param {Array} downloadUrl Optional array of download urls to update.
|
||||
*/
|
||||
phpbb.plupload.updateRow = function(index, downloadUrl) {
|
||||
var attach = phpbb.plupload.data[index],
|
||||
row = $('[data-attach-id="' + attach.attach_id + '"]');
|
||||
|
||||
// Add the link to the file
|
||||
if (typeof downloadUrl !== 'undefined' && typeof downloadUrl[index] !== 'undefined') {
|
||||
var url = downloadUrl[index].replace('&', '&'),
|
||||
link = $('<a></a>');
|
||||
|
||||
link.attr('href', url).html(attach.real_filename);
|
||||
row.find('.file-name').html(link);
|
||||
}
|
||||
|
||||
row.find('textarea').attr('name', 'comment_list[' + index + ']');
|
||||
phpbb.plupload.updateHiddenData(row, attach, index);
|
||||
};
|
||||
|
||||
/**
|
||||
* Update hidden input data for an attachment.
|
||||
*
|
||||
* @param {object} row jQuery object for the attachment row.
|
||||
* @param {object} attach Attachment data object from phpbb.plupload.data
|
||||
* @param {int} index Attachment index from phpbb.plupload.ids
|
||||
*/
|
||||
phpbb.plupload.updateHiddenData = function(row, attach, index) {
|
||||
row.find('input[type="hidden"]').remove();
|
||||
|
||||
for (var key in attach) {
|
||||
if (!attach.hasOwnProperty(key)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var input = $('<input />')
|
||||
.attr('type', 'hidden')
|
||||
.attr('name', 'attachment_data[' + index + '][' + key + ']')
|
||||
.attr('value', attach[key]);
|
||||
$(row).append(input);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Deleting a file removes it from the queue and fires an AJAX event to the
|
||||
* server to tell it to remove the temporary attachment. The server
|
||||
* responds with the updated attachment data list so that any future
|
||||
* uploads can maintain state with the server
|
||||
*
|
||||
* @param {object} row jQuery object for the attachment row.
|
||||
* @param {int} attachId Attachment id of the file to be removed.
|
||||
*/
|
||||
phpbb.plupload.deleteFile = function(row, attachId) {
|
||||
// If there's no attach id, then the file hasn't been uploaded. Simply delete the row.
|
||||
if (typeof attachId === 'undefined') {
|
||||
var file = phpbb.plupload.uploader.getFile(row.attr('id'));
|
||||
phpbb.plupload.uploader.removeFile(file);
|
||||
|
||||
row.slideUp(100, function() {
|
||||
row.remove();
|
||||
phpbb.plupload.hideEmptyList();
|
||||
});
|
||||
}
|
||||
|
||||
var index = phpbb.plupload.getIndex(attachId);
|
||||
row.find('.file-status').toggleClass('file-uploaded file-working');
|
||||
|
||||
if (index === false) {
|
||||
return;
|
||||
}
|
||||
var fields = {};
|
||||
fields['delete_file[' + index + ']'] = 1;
|
||||
|
||||
var always = function() {
|
||||
row.find('.file-status').removeClass('file-working');
|
||||
};
|
||||
|
||||
var done = function(response) {
|
||||
if (typeof response !== 'object') {
|
||||
return;
|
||||
}
|
||||
|
||||
// trigger_error() was called which likely means a permission error was encountered.
|
||||
if (typeof response.title !== 'undefined') {
|
||||
phpbb.plupload.uploader.trigger('Error', { message: response.message });
|
||||
// We will have to assume that the deletion failed. So leave the file status as uploaded.
|
||||
row.find('.file-status').toggleClass('file-uploaded');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Handle errors while deleting file
|
||||
if (typeof response.error !== 'undefined') {
|
||||
phpbb.alert(phpbb.plupload.lang.ERROR, response.error.message);
|
||||
|
||||
// We will have to assume that the deletion failed. So leave the file status as uploaded.
|
||||
row.find('.file-status').toggleClass('file-uploaded');
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
phpbb.plupload.update(response, 'removal', index);
|
||||
// Check if the user can upload files now if he had reached the max files limit.
|
||||
phpbb.plupload.handleMaxFilesReached();
|
||||
|
||||
if (row.attr('id')) {
|
||||
var file = phpbb.plupload.uploader.getFile(row.attr('id'));
|
||||
phpbb.plupload.uploader.removeFile(file);
|
||||
}
|
||||
row.slideUp(100, function() {
|
||||
row.remove();
|
||||
// Hide the file list if it's empty now.
|
||||
phpbb.plupload.hideEmptyList();
|
||||
});
|
||||
phpbb.plupload.uploader.trigger('FilesRemoved');
|
||||
};
|
||||
|
||||
$.ajax(phpbb.plupload.config.url, {
|
||||
type: 'POST',
|
||||
data: $.extend(fields, phpbb.plupload.getSerializedData()),
|
||||
headers: phpbb.plupload.config.headers
|
||||
})
|
||||
.always(always)
|
||||
.done(done);
|
||||
};
|
||||
|
||||
/**
|
||||
* Check the attachment list and hide its container if it's empty.
|
||||
*/
|
||||
phpbb.plupload.hideEmptyList = function() {
|
||||
if (!$('#file-list').children().length) {
|
||||
$('#file-list-container').slideUp(100);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Update the indices used in inline attachment bbcodes. This ensures that the
|
||||
* bbcodes correspond to the correct file after a file is added or removed.
|
||||
* This should be called before the phpbb.plupload,data and phpbb.plupload.ids
|
||||
* arrays are updated, otherwise it will not work correctly.
|
||||
*
|
||||
* @param {string} action The action that occurred -- either "addition" or "removal"
|
||||
* @param {int} index The index of the attachment from phpbb.plupload.ids that was affected.
|
||||
*/
|
||||
phpbb.plupload.updateBbcode = function(action, index) {
|
||||
var textarea = $('#message', phpbb.plupload.form),
|
||||
text = textarea.val(),
|
||||
removal = (action === 'removal');
|
||||
|
||||
// Return if the bbcode isn't used at all.
|
||||
if (text.indexOf('[attachment=') === -1) {
|
||||
return;
|
||||
}
|
||||
|
||||
function runUpdate(i) {
|
||||
var regex = new RegExp('\\[attachment=' + i + '\\](.*?)\\[\\/attachment\\]', 'g');
|
||||
text = text.replace(regex, function updateBbcode(_, fileName) {
|
||||
// Remove the bbcode if the file was removed.
|
||||
if (removal && index === i) {
|
||||
return '';
|
||||
}
|
||||
var newIndex = i + ((removal) ? -1 : 1);
|
||||
return '[attachment=' + newIndex + ']' + fileName + '[/attachment]';
|
||||
});
|
||||
}
|
||||
|
||||
// Loop forwards when removing and backwards when adding ensures we don't
|
||||
// corrupt the bbcode index.
|
||||
var i;
|
||||
if (removal) {
|
||||
for (i = index; i < phpbb.plupload.ids.length; i++) {
|
||||
runUpdate(i);
|
||||
}
|
||||
} else {
|
||||
for (i = phpbb.plupload.ids.length - 1; i >= index; i--) {
|
||||
runUpdate(i);
|
||||
}
|
||||
}
|
||||
|
||||
textarea.val(text);
|
||||
};
|
||||
|
||||
/**
|
||||
* Get Plupload file objects based on their upload status.
|
||||
*
|
||||
* @param {int} status Plupload status - plupload.DONE, plupload.FAILED,
|
||||
* plupload.QUEUED, plupload.STARTED, plupload.STOPPED
|
||||
*
|
||||
* @returns {Array} The Plupload file objects matching the status.
|
||||
*/
|
||||
phpbb.plupload.getFilesByStatus = function(status) {
|
||||
var files = [];
|
||||
|
||||
$.each(phpbb.plupload.uploader.files, function(i, file) {
|
||||
if (file.status === status) {
|
||||
files.push(file);
|
||||
}
|
||||
});
|
||||
return files;
|
||||
};
|
||||
|
||||
/**
|
||||
* Check whether the user has reached the maximun number of files that he's allowed
|
||||
* to upload. If so, disables the uploader and marks the queued files as failed. Otherwise
|
||||
* makes sure that the uploader is enabled.
|
||||
*
|
||||
* @returns {bool} True if the limit has been reached. False if otherwise.
|
||||
*/
|
||||
phpbb.plupload.handleMaxFilesReached = function() {
|
||||
// If there is no limit, the user is an admin or moderator.
|
||||
if (!phpbb.plupload.maxFiles) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (phpbb.plupload.maxFiles <= phpbb.plupload.ids.length) {
|
||||
// Fail the rest of the queue.
|
||||
phpbb.plupload.markQueuedFailed(phpbb.plupload.lang.TOO_MANY_ATTACHMENTS);
|
||||
// Disable the uploader.
|
||||
phpbb.plupload.disableUploader();
|
||||
phpbb.plupload.uploader.trigger('Error', { message: phpbb.plupload.lang.TOO_MANY_ATTACHMENTS });
|
||||
|
||||
return true;
|
||||
} else if (phpbb.plupload.maxFiles > phpbb.plupload.ids.length) {
|
||||
// Enable the uploader if the user is under the limit
|
||||
phpbb.plupload.enableUploader();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
* Disable the uploader
|
||||
*/
|
||||
phpbb.plupload.disableUploader = function() {
|
||||
$('#add_files').addClass('disabled');
|
||||
phpbb.plupload.uploader.disableBrowse();
|
||||
};
|
||||
|
||||
/**
|
||||
* Enable the uploader
|
||||
*/
|
||||
phpbb.plupload.enableUploader = function() {
|
||||
$('#add_files').removeClass('disabled');
|
||||
phpbb.plupload.uploader.disableBrowse(false);
|
||||
};
|
||||
|
||||
/**
|
||||
* Mark all queued files as failed.
|
||||
*
|
||||
* @param {string} error Error message to present to the user.
|
||||
*/
|
||||
phpbb.plupload.markQueuedFailed = function(error) {
|
||||
var files = phpbb.plupload.getFilesByStatus(plupload.QUEUED);
|
||||
|
||||
$.each(files, function(i, file) {
|
||||
$('#' + file.id).find('.file-progress').hide();
|
||||
phpbb.plupload.fileError(file, error);
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Marks a file as failed and sets the error message for it.
|
||||
*
|
||||
* @param {object} file Plupload file object that failed.
|
||||
* @param {string} error Error message to present to the user.
|
||||
*/
|
||||
phpbb.plupload.fileError = function(file, error) {
|
||||
file.status = plupload.FAILED;
|
||||
file.error = error;
|
||||
$('#' + file.id).find('.file-status')
|
||||
.addClass('file-error')
|
||||
.attr({
|
||||
'data-error-title': phpbb.plupload.lang.ERROR,
|
||||
'data-error-message': error
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Set up the Plupload object and get some basic data.
|
||||
*/
|
||||
phpbb.plupload.uploader = new plupload.Uploader(phpbb.plupload.config);
|
||||
phpbb.plupload.initialize();
|
||||
|
||||
/**
|
||||
* Add a file filter to check for max file sizes per mime type.
|
||||
*/
|
||||
plupload.addFileFilter('mime_types_max_file_size', function(types, file, callback) {
|
||||
if (file.size !== 'undefined') {
|
||||
$(types).each(function(i, type) {
|
||||
let extensions = [],
|
||||
extsArray = type.extensions.split(',');
|
||||
|
||||
$(extsArray).each(function(i, extension) {
|
||||
/^\s*\*\s*$/.test(extension) ? extensions.push("\\.*") : extensions.push("\\." + extension.replace(new RegExp("[" + "/^$.*+?|()[]{}\\".replace(/./g, "\\$&") + "]", "g"), "\\$&"));
|
||||
});
|
||||
|
||||
let regex = new RegExp("(" + extensions.join("|") + ")$", "i");
|
||||
|
||||
if (regex.test(file.name)) {
|
||||
if (type.max_file_size !== 'undefined' && type.max_file_size) {
|
||||
if (file.size > type.max_file_size) {
|
||||
phpbb.plupload.uploader.trigger('Error', {
|
||||
code: plupload.FILE_SIZE_ERROR,
|
||||
message: plupload.translate('File size error.'),
|
||||
file: file
|
||||
});
|
||||
|
||||
callback(false);
|
||||
} else {
|
||||
callback(true);
|
||||
}
|
||||
} else {
|
||||
callback(true);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
var $fileList = $('#file-list');
|
||||
|
||||
/**
|
||||
* Insert inline attachment bbcode.
|
||||
*/
|
||||
$fileList.on('click', '.file-inline-bbcode', function(e) {
|
||||
var attachId = $(this).parents('.attach-row').attr('data-attach-id'),
|
||||
index = phpbb.plupload.getIndex(attachId);
|
||||
|
||||
attachInline(index, phpbb.plupload.data[index].real_filename);
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
/**
|
||||
* Delete a file.
|
||||
*/
|
||||
$fileList.on('click', '.file-delete', function(e) {
|
||||
var row = $(this).parents('.attach-row'),
|
||||
attachId = row.attr('data-attach-id');
|
||||
|
||||
phpbb.plupload.deleteFile(row, attachId);
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
/**
|
||||
* Display the error message for a particular file when the error icon is clicked.
|
||||
*/
|
||||
$fileList.on('click', '.file-error', function(e) {
|
||||
phpbb.alert($(this).attr('data-error-title'), $(this).attr('data-error-message'));
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
/**
|
||||
* Fires when an error occurs.
|
||||
*/
|
||||
phpbb.plupload.uploader.bind('Error', function(up, error) {
|
||||
error.file.name = plupload.xmlEncode(error.file.name);
|
||||
|
||||
// The error message that Plupload provides for these is vague, so we'll be more specific.
|
||||
if (error.code === plupload.FILE_EXTENSION_ERROR) {
|
||||
error.message = plupload.translate('Invalid file extension:') + ' ' + error.file.name;
|
||||
} else if (error.code === plupload.FILE_SIZE_ERROR) {
|
||||
error.message = plupload.translate('File too large:') + ' ' + error.file.name;
|
||||
}
|
||||
phpbb.alert(phpbb.plupload.lang.ERROR, error.message);
|
||||
});
|
||||
|
||||
/**
|
||||
* Fires before a given file is about to be uploaded. This allows us to
|
||||
* send the real filename along with the chunk. This is necessary because
|
||||
* for some reason the filename is set to 'blob' whenever a file is chunked
|
||||
*
|
||||
* @param {object} up The plupload.Uploader object
|
||||
* @param {object} file The plupload.File object that is about to be uploaded
|
||||
*/
|
||||
phpbb.plupload.uploader.bind('BeforeUpload', function(up, file) {
|
||||
if (phpbb.plupload.handleMaxFilesReached()) {
|
||||
return;
|
||||
}
|
||||
|
||||
phpbb.plupload.updateMultipartParams({ real_filename: file.name });
|
||||
});
|
||||
|
||||
/**
|
||||
* Fired when a single chunk of any given file is uploaded. This parses the
|
||||
* response from the server and checks for an error. If an error occurs it
|
||||
* is reported to the user and the upload of this particular file is halted
|
||||
*
|
||||
* @param {object} up The plupload.Uploader object
|
||||
* @param {object} file The plupload.File object whose chunk has just
|
||||
* been uploaded
|
||||
* @param {object} response The response object from the server
|
||||
*/
|
||||
phpbb.plupload.uploader.bind('ChunkUploaded', function(up, file, response) {
|
||||
if (response.chunk >= response.chunks - 1) {
|
||||
return;
|
||||
}
|
||||
|
||||
var json = {};
|
||||
try {
|
||||
json = $.parseJSON(response.response);
|
||||
} catch (e) {
|
||||
file.status = plupload.FAILED;
|
||||
up.trigger('FileUploaded', file, {
|
||||
response: JSON.stringify({
|
||||
error: {
|
||||
message: 'Error parsing server response.'
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
// If trigger_error() was called, then a permission error likely occurred.
|
||||
if (typeof json.title !== 'undefined') {
|
||||
json.error = { message: json.message };
|
||||
}
|
||||
|
||||
if (json.error) {
|
||||
file.status = plupload.FAILED;
|
||||
up.trigger('FileUploaded', file, {
|
||||
response: JSON.stringify({
|
||||
error: {
|
||||
message: json.error.message
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Fires when files are added to the queue.
|
||||
*/
|
||||
phpbb.plupload.uploader.bind('FilesAdded', function(up, files) {
|
||||
// Prevent unnecessary requests to the server if the user already uploaded
|
||||
// the maximum number of files allowed.
|
||||
if (phpbb.plupload.handleMaxFilesReached()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Switch the active tab if the style supports it
|
||||
if (typeof activateSubPanel === 'function') {
|
||||
activateSubPanel('attach-panel'); // jshint ignore: line
|
||||
}
|
||||
|
||||
// Show the file list if there aren't any files currently.
|
||||
var $fileListContainer = $('#file-list-container');
|
||||
if (!$fileListContainer.is(':visible')) {
|
||||
$fileListContainer.show(100);
|
||||
}
|
||||
|
||||
$.each(files, function(i, file) {
|
||||
phpbb.plupload.insertRow(file);
|
||||
});
|
||||
|
||||
up.bind('UploadProgress', function(up, file) {
|
||||
$('.file-progress-bar', '#' + file.id).css('width', file.percent + '%');
|
||||
$('#file-total-progress-bar').css('width', up.total.percent + '%');
|
||||
});
|
||||
|
||||
// Do not allow more files to be added to the running queue.
|
||||
phpbb.plupload.disableUploader();
|
||||
|
||||
// Start uploading the files once the user has selected them.
|
||||
up.start();
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Fires when an entire file has been uploaded. It checks for errors
|
||||
* returned by the server otherwise parses the list of attachment data and
|
||||
* appends it to the next file upload so that the server can maintain state
|
||||
* with regards to the attachments in a given post
|
||||
*
|
||||
* @param {object} up The plupload.Uploader object
|
||||
* @param {object} file The plupload.File object that has just been
|
||||
* uploaded
|
||||
* @param {string} response The response string from the server
|
||||
*/
|
||||
phpbb.plupload.uploader.bind('FileUploaded', function(up, file, response) {
|
||||
var json = {},
|
||||
row = $('#' + file.id),
|
||||
error;
|
||||
|
||||
// Hide the progress indicator.
|
||||
row.find('.file-progress').hide();
|
||||
|
||||
try {
|
||||
json = JSON.parse(response.response);
|
||||
} catch (e) {
|
||||
error = 'Error parsing server response.';
|
||||
}
|
||||
|
||||
// If trigger_error() was called, then a permission error likely occurred.
|
||||
if (typeof json.title !== 'undefined') {
|
||||
error = json.message;
|
||||
up.trigger('Error', { message: error });
|
||||
|
||||
// The rest of the queue will fail.
|
||||
phpbb.plupload.markQueuedFailed(error);
|
||||
} else if (json.error) {
|
||||
error = json.error.message;
|
||||
}
|
||||
|
||||
if (typeof error !== 'undefined') {
|
||||
phpbb.plupload.fileError(file, error);
|
||||
} else if (file.status === plupload.DONE) {
|
||||
file.attachment_data = json.data[0];
|
||||
|
||||
row.attr('data-attach-id', file.attachment_data.attach_id);
|
||||
row.find('.file-inline-bbcode').show();
|
||||
row.find('.file-status').addClass('file-uploaded');
|
||||
phpbb.plupload.update(json.data, 'addition', 0, [json.download_url]);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Fires when the entire queue of files have been uploaded.
|
||||
*/
|
||||
phpbb.plupload.uploader.bind('UploadComplete', function() {
|
||||
// Hide the progress bar
|
||||
setTimeout(function() {
|
||||
$('#file-total-progress-bar').fadeOut(500, function() {
|
||||
$(this).css('width', 0).show();
|
||||
});
|
||||
}, 2000);
|
||||
|
||||
// Re-enable the uploader
|
||||
phpbb.plupload.enableUploader();
|
||||
});
|
||||
|
||||
})(jQuery); // Avoid conflicts with other libraries
|
29
public/assets/plupload/plupload.full.min.js
vendored
Normal file
29
public/assets/plupload/plupload.full.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
6
public/styles/all/imgs/svg/phpbb_logo_large_cosmic.svg
Normal file
6
public/styles/all/imgs/svg/phpbb_logo_large_cosmic.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 33 KiB |
37
public/styles/all/template/feed.xml.twig
Normal file
37
public/styles/all/template/feed.xml.twig
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="{{ FEED_LANG }}">
|
||||
<link rel="self" type="application/atom+xml" href="{{ SELF_LINK }}" />
|
||||
|
||||
{% if not FEED_TITLE is empty %}<title>{{ FEED_TITLE }}</title>{% endif %}
|
||||
|
||||
{% if not FEED_SUBTITLE is empty %}<subtitle>{{ FEED_SUBTITLE }}</subtitle>{% endif %}
|
||||
|
||||
{% if not FEED_LINK is empty %}<link href="{{ FEED_LINK }}" />{% endif %}
|
||||
|
||||
<updated>{{ FEED_UPDATED }}</updated>
|
||||
|
||||
<author><name><![CDATA[{{ FEED_AUTHOR }}]]></name></author>
|
||||
<id>{{ SELF_LINK }}</id>
|
||||
|
||||
{% for row in FEED_ROWS %}
|
||||
<entry>
|
||||
{% if not row.author is empty %}<author><name><![CDATA[{{ row.author }}]]></name></author>{% endif %}
|
||||
|
||||
<updated>{% if not row.updated is empty %}{{ row.updated }} {% else %}{{ row.published }}{% endif %}</updated>
|
||||
|
||||
{% if not row.published is empty %}<published>{{ row.published }}</published>{% endif %}
|
||||
|
||||
<id>{{ row.link }}</id>
|
||||
<link href="{{ row.link }}"/>
|
||||
<title type="html"><![CDATA[{{ row.title }}]]></title>
|
||||
|
||||
{% if not row.category is empty and row.category_name is defined and row.category_name != '' %}
|
||||
<category term="{{ row.category_name }}" scheme="{{ row.category }}" label="{{ row.category_name }}"/>
|
||||
{% endif %}
|
||||
|
||||
<content type="html" xml:base="{{ row.link }}"><![CDATA[
|
||||
{{ row.description }}{% if not row.statistics is empty %}<p>{{ lang('STATISTICS') }}: {{ row.statistics }}</p>{% endif %}<hr />
|
||||
]]></content>
|
||||
</entry>
|
||||
{% endfor %}
|
||||
</feed>
|
32
public/styles/prosilver/style.cfg
Normal file
32
public/styles/prosilver/style.cfg
Normal file
|
@ -0,0 +1,32 @@
|
|||
#
|
||||
# phpBB Style Configuration File
|
||||
#
|
||||
# This file is part of the phpBB Forum Software package.
|
||||
#
|
||||
# @copyright (c) phpBB Limited <https://www.phpbb.com>
|
||||
# @license GNU General Public License, version 2 (GPL-2.0)
|
||||
#
|
||||
# For full copyright and license information, please see
|
||||
# the docs/CREDITS.txt file.
|
||||
#
|
||||
# At the left is the name, please do not change this
|
||||
# At the right the value is entered
|
||||
#
|
||||
# Values get trimmed, if you want to add a space in front or at the end of
|
||||
# the value, then enclose the value with single or double quotes.
|
||||
# Single and double quotes do not need to be escaped.
|
||||
#
|
||||
#
|
||||
|
||||
# General Information about this style
|
||||
name = prosilver
|
||||
copyright = © phpBB Limited, 2007
|
||||
style_version = 3.3.2
|
||||
phpbb_version = 3.3.2
|
||||
|
||||
# Defining a different template bitfield
|
||||
# template_bitfield = //g=
|
||||
|
||||
# Parent style
|
||||
# Set value to empty or to this style's name if this style does not have a parent style
|
||||
parent = prosilver
|
394
public/styles/prosilver/template/ajax.js
Normal file
394
public/styles/prosilver/template/ajax.js
Normal file
|
@ -0,0 +1,394 @@
|
|||
/* global phpbb */
|
||||
|
||||
(function($) { // Avoid conflicts with other libraries
|
||||
|
||||
'use strict';
|
||||
|
||||
// This callback will mark all forum icons read
|
||||
phpbb.addAjaxCallback('mark_forums_read', function(res) {
|
||||
var readTitle = res.NO_UNREAD_POSTS;
|
||||
var unreadTitle = res.UNREAD_POSTS;
|
||||
var iconsArray = {
|
||||
forum_unread: 'forum_read',
|
||||
forum_unread_subforum: 'forum_read_subforum',
|
||||
forum_unread_locked: 'forum_read_locked'
|
||||
};
|
||||
|
||||
$('li.row').find('dl[class*="forum_unread"]').each(function() {
|
||||
var $this = $(this);
|
||||
|
||||
$.each(iconsArray, function(unreadClass, readClass) {
|
||||
if ($this.hasClass(unreadClass)) {
|
||||
$this.removeClass(unreadClass).addClass(readClass);
|
||||
}
|
||||
});
|
||||
$this.children('dt[title="' + unreadTitle + '"]').attr('title', readTitle);
|
||||
});
|
||||
|
||||
// Mark subforums read
|
||||
$('a.subforum[class*="unread"]').removeClass('unread').addClass('read').children('.icon.icon-red').removeClass('icon-red').addClass('icon-blue');
|
||||
|
||||
// Mark topics read if we are watching a category and showing active topics
|
||||
if ($('#active_topics').length) {
|
||||
phpbb.ajaxCallbacks.mark_topics_read.call(this, res, false);
|
||||
}
|
||||
|
||||
// Update mark forums read links
|
||||
$('[data-ajax="mark_forums_read"]').attr('href', res.U_MARK_FORUMS);
|
||||
|
||||
phpbb.closeDarkenWrapper(3000);
|
||||
});
|
||||
|
||||
/**
|
||||
* This callback will mark all topic icons read
|
||||
*
|
||||
* @param {bool} [update_topic_links=true] Whether "Mark topics read" links
|
||||
* should be updated. Defaults to true.
|
||||
*/
|
||||
phpbb.addAjaxCallback('mark_topics_read', function(res, updateTopicLinks) {
|
||||
var readTitle = res.NO_UNREAD_POSTS;
|
||||
var unreadTitle = res.UNREAD_POSTS;
|
||||
var iconsArray = {
|
||||
global_unread: 'global_read',
|
||||
announce_unread: 'announce_read',
|
||||
sticky_unread: 'sticky_read',
|
||||
topic_unread: 'topic_read'
|
||||
};
|
||||
var iconsState = ['', '_hot', '_hot_mine', '_locked', '_locked_mine', '_mine'];
|
||||
var unreadClassSelectors;
|
||||
var classMap = {};
|
||||
var classNames = [];
|
||||
|
||||
if (typeof updateTopicLinks === 'undefined') {
|
||||
updateTopicLinks = true;
|
||||
}
|
||||
|
||||
$.each(iconsArray, function(unreadClass, readClass) {
|
||||
$.each(iconsState, function(key, value) {
|
||||
// Only topics can be hot
|
||||
if ((value === '_hot' || value === '_hot_mine') && unreadClass !== 'topic_unread') {
|
||||
return true;
|
||||
}
|
||||
classMap[unreadClass + value] = readClass + value;
|
||||
classNames.push(unreadClass + value);
|
||||
});
|
||||
});
|
||||
|
||||
unreadClassSelectors = '.' + classNames.join(',.');
|
||||
|
||||
$('li.row').find(unreadClassSelectors).each(function() {
|
||||
var $this = $(this);
|
||||
$.each(classMap, function(unreadClass, readClass) {
|
||||
if ($this.hasClass(unreadClass)) {
|
||||
$this.removeClass(unreadClass).addClass(readClass);
|
||||
}
|
||||
});
|
||||
$this.children('dt[title="' + unreadTitle + '"]').attr('title', readTitle);
|
||||
});
|
||||
|
||||
// Remove link to first unread post
|
||||
$('a.unread').has('.icon-red').remove();
|
||||
|
||||
// Update mark topics read links
|
||||
if (updateTopicLinks) {
|
||||
$('[data-ajax="mark_topics_read"]').attr('href', res.U_MARK_TOPICS);
|
||||
}
|
||||
|
||||
phpbb.closeDarkenWrapper(3000);
|
||||
});
|
||||
|
||||
// This callback will mark all notifications read
|
||||
phpbb.addAjaxCallback('notification.mark_all_read', function(res) {
|
||||
if (typeof res.success !== 'undefined') {
|
||||
phpbb.markNotifications($('#notification_list li.bg2'), 0);
|
||||
phpbb.closeDarkenWrapper(3000);
|
||||
}
|
||||
});
|
||||
|
||||
// This callback will mark a notification read
|
||||
phpbb.addAjaxCallback('notification.mark_read', function(res) {
|
||||
if (typeof res.success !== 'undefined') {
|
||||
var unreadCount = Number($('#notification_list_button strong').html()) - 1;
|
||||
phpbb.markNotifications($(this).parent('li.bg2'), unreadCount);
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Mark notification popup rows as read.
|
||||
*
|
||||
* @param {jQuery} $popup jQuery object(s) to mark read.
|
||||
* @param {int} unreadCount The new unread notifications count.
|
||||
*/
|
||||
phpbb.markNotifications = function($popup, unreadCount) {
|
||||
// Remove the unread status.
|
||||
$popup.removeClass('bg2');
|
||||
$popup.find('a.mark_read').remove();
|
||||
|
||||
// Update the notification link to the real URL.
|
||||
$popup.each(function() {
|
||||
var link = $(this).find('a');
|
||||
link.attr('href', link.attr('data-real-url'));
|
||||
});
|
||||
|
||||
// Update the unread count.
|
||||
$('strong', '#notification_list_button').html(unreadCount);
|
||||
// Remove the Mark all read link and hide notification count if there are no unread notifications.
|
||||
if (!unreadCount) {
|
||||
$('#mark_all_notifications').remove();
|
||||
$('#notification_list_button > strong').addClass('hidden');
|
||||
}
|
||||
|
||||
// Update page title
|
||||
var $title = $('title');
|
||||
var originalTitle = $title.text().replace(/(\((\d+)\))/, '');
|
||||
$title.text((unreadCount ? '(' + unreadCount + ')' : '') + originalTitle);
|
||||
};
|
||||
|
||||
// This callback finds the post from the delete link, and removes it.
|
||||
phpbb.addAjaxCallback('post_delete', function() {
|
||||
var $this = $(this),
|
||||
postId;
|
||||
|
||||
if ($this.attr('data-refresh') === undefined) {
|
||||
postId = $this[0].href.split('&p=')[1];
|
||||
var post = $this.parents('#p' + postId).css('pointer-events', 'none');
|
||||
if (post.hasClass('bg1') || post.hasClass('bg2')) {
|
||||
var posts1 = post.nextAll('.bg1');
|
||||
post.nextAll('.bg2').removeClass('bg2').addClass('bg1');
|
||||
posts1.removeClass('bg1').addClass('bg2');
|
||||
}
|
||||
post.fadeOut(function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// This callback removes the approve / disapprove div or link.
|
||||
phpbb.addAjaxCallback('post_visibility', function(res) {
|
||||
var remove = (res.visible) ? $(this) : $(this).parents('.post');
|
||||
$(remove).css('pointer-events', 'none').fadeOut(function() {
|
||||
$(this).remove();
|
||||
});
|
||||
|
||||
if (res.visible) {
|
||||
// Remove the "Deleted by" message from the post on restoring.
|
||||
remove.parents('.post').find('.post_deleted_msg').css('pointer-events', 'none').fadeOut(function() {
|
||||
$(this).remove();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// This removes the parent row of the link or form that fired the callback.
|
||||
phpbb.addAjaxCallback('row_delete', function() {
|
||||
$(this).parents('tr').remove();
|
||||
});
|
||||
|
||||
// This handles friend / foe additions removals.
|
||||
phpbb.addAjaxCallback('zebra', function(res) {
|
||||
var zebra;
|
||||
|
||||
if (res.success) {
|
||||
zebra = $('.zebra');
|
||||
zebra.first().html(res.MESSAGE_TEXT);
|
||||
zebra.not(':first').html(' ').prev().html(' ');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* This callback updates the poll results after voting.
|
||||
*/
|
||||
phpbb.addAjaxCallback('vote_poll', function(res) {
|
||||
if (typeof res.success !== 'undefined') {
|
||||
var poll = $(this).closest('.topic_poll');
|
||||
var panel = poll.find('.panel');
|
||||
var resultsVisible = poll.find('dl:first-child .resultbar').is(':visible');
|
||||
var mostVotes = 0;
|
||||
|
||||
// Set min-height to prevent the page from jumping when the content changes
|
||||
var updatePanelHeight = function (height) {
|
||||
height = (typeof height === 'undefined') ? panel.find('.inner').outerHeight() : height;
|
||||
panel.css('min-height', height);
|
||||
};
|
||||
updatePanelHeight();
|
||||
|
||||
// Remove the View results link
|
||||
if (!resultsVisible) {
|
||||
poll.find('.poll_view_results').hide(500);
|
||||
}
|
||||
|
||||
if (!res.can_vote) {
|
||||
poll.find('.polls, .poll_max_votes, .poll_vote, .poll_option_select').fadeOut(500, function () {
|
||||
poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show();
|
||||
});
|
||||
} else {
|
||||
// If the user can still vote, simply slide down the results
|
||||
poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show(500);
|
||||
}
|
||||
|
||||
// Get the votes count of the highest poll option
|
||||
poll.find('[data-poll-option-id]').each(function() {
|
||||
var option = $(this);
|
||||
var optionId = option.attr('data-poll-option-id');
|
||||
mostVotes = (res.vote_counts[optionId] >= mostVotes) ? res.vote_counts[optionId] : mostVotes;
|
||||
});
|
||||
|
||||
// Update the total votes count
|
||||
poll.find('.poll_total_vote_cnt').html(res.total_votes);
|
||||
|
||||
// Update each option
|
||||
poll.find('[data-poll-option-id]').each(function() {
|
||||
var $this = $(this);
|
||||
var optionId = $this.attr('data-poll-option-id');
|
||||
var voted = (typeof res.user_votes[optionId] !== 'undefined');
|
||||
var mostVoted = (res.vote_counts[optionId] === mostVotes);
|
||||
var percent = (!res.total_votes) ? 0 : Math.round((res.vote_counts[optionId] / res.total_votes) * 100);
|
||||
var percentRel = (mostVotes === 0) ? 0 : Math.round((res.vote_counts[optionId] / mostVotes) * 100);
|
||||
var altText;
|
||||
|
||||
altText = $this.attr('data-alt-text');
|
||||
if (voted) {
|
||||
$this.attr('title', $.trim(altText));
|
||||
} else {
|
||||
$this.attr('title', '');
|
||||
};
|
||||
$this.toggleClass('voted', voted);
|
||||
$this.toggleClass('most-votes', mostVoted);
|
||||
|
||||
// Update the bars
|
||||
var bar = $this.find('.resultbar div');
|
||||
var barTimeLapse = (res.can_vote) ? 500 : 1500;
|
||||
var newBarClass = (percent === 100) ? 'pollbar5' : 'pollbar' + (Math.floor(percent / 20) + 1);
|
||||
|
||||
setTimeout(function () {
|
||||
bar.animate({ width: percentRel + '%' }, 500)
|
||||
.removeClass('pollbar1 pollbar2 pollbar3 pollbar4 pollbar5')
|
||||
.addClass(newBarClass)
|
||||
.html(res.vote_counts[optionId]);
|
||||
|
||||
var percentText = percent ? percent + '%' : res.NO_VOTES;
|
||||
$this.find('.poll_option_percent').html(percentText);
|
||||
}, barTimeLapse);
|
||||
});
|
||||
|
||||
if (!res.can_vote) {
|
||||
poll.find('.polls').delay(400).fadeIn(500);
|
||||
}
|
||||
|
||||
// Display "Your vote has been cast." message. Disappears after 5 seconds.
|
||||
var confirmationDelay = (res.can_vote) ? 300 : 900;
|
||||
poll.find('.vote-submitted').delay(confirmationDelay).slideDown(200, function() {
|
||||
if (resultsVisible) {
|
||||
updatePanelHeight();
|
||||
}
|
||||
|
||||
$(this).delay(5000).fadeOut(500, function() {
|
||||
resizePanel(300);
|
||||
});
|
||||
});
|
||||
|
||||
// Remove the gap resulting from removing options
|
||||
setTimeout(function() {
|
||||
resizePanel(500);
|
||||
}, 1500);
|
||||
|
||||
var resizePanel = function (time) {
|
||||
var panelHeight = panel.height();
|
||||
var innerHeight = panel.find('.inner').outerHeight();
|
||||
|
||||
if (panelHeight !== innerHeight) {
|
||||
panel.css({ minHeight: '', height: panelHeight })
|
||||
.animate({ height: innerHeight }, time, function () {
|
||||
panel.css({ minHeight: innerHeight, height: '' });
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Show poll results when clicking View results link.
|
||||
*/
|
||||
$('.poll_view_results a').click(function(e) {
|
||||
// Do not follow the link
|
||||
e.preventDefault();
|
||||
|
||||
var $poll = $(this).parents('.topic_poll');
|
||||
|
||||
$poll.find('.resultbar, .poll_option_percent, .poll_total_votes').show(500);
|
||||
$poll.find('.poll_view_results').hide(500);
|
||||
});
|
||||
|
||||
$('[data-ajax]').each(function() {
|
||||
var $this = $(this);
|
||||
var ajax = $this.attr('data-ajax');
|
||||
var filter = $this.attr('data-filter');
|
||||
|
||||
if (ajax !== 'false') {
|
||||
var fn = (ajax !== 'true') ? ajax : null;
|
||||
filter = (filter !== undefined) ? phpbb.getFunctionByName(filter) : null;
|
||||
|
||||
phpbb.ajaxify({
|
||||
selector: this,
|
||||
refresh: $this.attr('data-refresh') !== undefined,
|
||||
filter: filter,
|
||||
callback: fn
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* This simply appends #preview to the action of the
|
||||
* QR action when you click the Full Editor & Preview button
|
||||
*/
|
||||
$('#qr_full_editor').click(function() {
|
||||
$('#qr_postform').attr('action', function(i, val) {
|
||||
return val + '#preview';
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* Make the display post links to use JS
|
||||
*/
|
||||
$('.display_post').click(function(e) {
|
||||
// Do not follow the link
|
||||
e.preventDefault();
|
||||
|
||||
var postId = $(this).attr('data-post-id');
|
||||
$('#post_content' + postId).show();
|
||||
$('#profile' + postId).show();
|
||||
$('#post_hidden' + postId).hide();
|
||||
});
|
||||
|
||||
/**
|
||||
* Toggle the member search panel in memberlist.php.
|
||||
*
|
||||
* If user returns to search page after viewing results the search panel is automatically displayed.
|
||||
* In any case the link will toggle the display status of the search panel and link text will be
|
||||
* appropriately changed based on the status of the search panel.
|
||||
*/
|
||||
$('#member_search').click(function () {
|
||||
var $memberlistSearch = $('#memberlist_search');
|
||||
|
||||
$memberlistSearch.slideToggle('fast');
|
||||
phpbb.ajaxCallbacks.alt_text.call(this);
|
||||
|
||||
// Focus on the username textbox if it's available and displayed
|
||||
if ($memberlistSearch.is(':visible')) {
|
||||
$('#username').focus();
|
||||
}
|
||||
return false;
|
||||
});
|
||||
|
||||
/**
|
||||
* Automatically resize textarea
|
||||
*/
|
||||
$(function() {
|
||||
var $textarea = $('textarea:not(#message-box textarea, .no-auto-resize)');
|
||||
phpbb.resizeTextArea($textarea, { minHeight: 75, maxHeight: 250 });
|
||||
phpbb.resizeTextArea($('textarea', '#message-box'));
|
||||
});
|
||||
|
||||
|
||||
})(jQuery); // Avoid conflicts with other libraries
|
35
public/styles/prosilver/template/attachment.html
Normal file
35
public/styles/prosilver/template/attachment.html
Normal file
|
@ -0,0 +1,35 @@
|
|||
<!-- EVENT attachment_file_before -->
|
||||
|
||||
<!-- BEGIN _file -->
|
||||
<!-- IF _file.S_DENIED -->
|
||||
<p>[{_file.DENIED_MESSAGE}]</p>
|
||||
<!-- ELSE -->
|
||||
<!-- EVENT attachment_file_prepend -->
|
||||
|
||||
<!-- IF _file.S_THUMBNAIL -->
|
||||
<dl class="thumbnail">
|
||||
<dt><a href="{_file.U_DOWNLOAD_LINK}"><img src="{_file.THUMB_IMAGE}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" title="{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}" /></a></dt>
|
||||
<!-- IF _file.COMMENT --><dd> {_file.COMMENT}</dd><!-- ENDIF -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF _file.S_IMAGE -->
|
||||
<dl class="file">
|
||||
<dt class="attach-image"><img src="{_file.U_INLINE_LINK}" class="postimage" alt="{% if _file.COMMENT %}{{ _file.COMMENT|e('html') }}{% else %}{{ _file.DOWNLOAD_NAME }}{% endif %}" onclick="viewableArea(this);" /></dt>
|
||||
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
|
||||
<dd>{_file.DOWNLOAD_NAME} ({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF _file.S_FILE -->
|
||||
<dl class="file">
|
||||
<dt><!-- IF _file.UPLOAD_ICON -->{_file.UPLOAD_ICON} <!-- ENDIF --><a class="postlink" href="{_file.U_DOWNLOAD_LINK}">{_file.DOWNLOAD_NAME}</a></dt>
|
||||
<!-- IF _file.COMMENT --><dd><em>{_file.COMMENT}</em></dd><!-- ENDIF -->
|
||||
<dd>({_file.FILESIZE} {_file.SIZE_LANG}) {_file.L_DOWNLOAD_COUNT}</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT attachment_file_append -->
|
||||
<!-- ENDIF -->
|
||||
<!-- END _file -->
|
||||
<!-- EVENT attachment_file_after -->
|
95
public/styles/prosilver/template/bbcode.html
Normal file
95
public/styles/prosilver/template/bbcode.html
Normal file
|
@ -0,0 +1,95 @@
|
|||
<!-- BEGIN ulist_open --><ul style="list-style-type: {LIST_TYPE}"><!-- END ulist_open -->
|
||||
<!-- BEGIN ulist_open_default --><ul><!-- END ulist_open_default -->
|
||||
<!-- BEGIN ulist_close --></ul><!-- END ulist_close -->
|
||||
|
||||
<!-- BEGIN olist_open --><ol style="list-style-type: {LIST_TYPE}"><!-- END olist_open -->
|
||||
<!-- BEGIN olist_close --></ol><!-- END olist_close -->
|
||||
|
||||
<!-- BEGIN listitem --><li><!-- END listitem -->
|
||||
<!-- BEGIN listitem_close --></li><!-- END listitem_close -->
|
||||
|
||||
<!-- BEGIN quote_username_open --><blockquote><div><cite>{USERNAME} {L_WROTE}{L_COLON}</cite><!-- END quote_username_open -->
|
||||
<!-- BEGIN quote_open --><blockquote class="uncited"><div><!-- END quote_open -->
|
||||
<!-- BEGIN quote_close --></div></blockquote><!-- END quote_close -->
|
||||
<!-- BEGIN quote_extended -->
|
||||
<blockquote>
|
||||
<xsl:if test="@post_url">
|
||||
<xsl:attribute name="cite"><xsl:value-of select="@post_url"/></xsl:attribute>
|
||||
</xsl:if>
|
||||
<xsl:if test="not(@author)">
|
||||
<xsl:attribute name="class">uncited</xsl:attribute>
|
||||
</xsl:if>
|
||||
<div>
|
||||
<xsl:if test="@author">
|
||||
<cite>
|
||||
<xsl:choose>
|
||||
<xsl:when test="@url">
|
||||
<a href="{@url}" class="postlink"><xsl:value-of select="@author"/></a>
|
||||
</xsl:when>
|
||||
<xsl:when test="@profile_url">
|
||||
<a href="{@profile_url}"><xsl:value-of select="@author"/></a>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="@author"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:value-of select="$L_WROTE"/>
|
||||
<xsl:value-of select="$L_COLON"/>
|
||||
<xsl:if test="@post_url">
|
||||
<xsl:text> </xsl:text>
|
||||
<a href="{@post_url}" data-post-id="{@post_id}" onclick="if(document.getElementById(hash.substr(1)))href=hash">↑</a>
|
||||
</xsl:if>
|
||||
<xsl:if test="@msg_url">
|
||||
<xsl:text> </xsl:text>
|
||||
<a href="{@msg_url}" data-msg-id="{@msg_id}">↑</a>
|
||||
</xsl:if>
|
||||
<xsl:if test="@date">
|
||||
<span class="responsive-hide"><xsl:value-of select="@date"/></span>
|
||||
</xsl:if>
|
||||
</cite>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates/>
|
||||
</div>
|
||||
</blockquote>
|
||||
<!-- END quote_extended -->
|
||||
|
||||
<!-- BEGIN code_open --><div class="codebox"><p>{L_CODE}{L_COLON} <a href="#" onclick="selectCode(this); return false;">{L_SELECT_ALL_CODE}</a></p><pre><code><!-- END code_open -->
|
||||
<!-- BEGIN code_close --></code></pre></div><!-- END code_close -->
|
||||
|
||||
<!-- BEGIN inline_attachment_open --><div class="inline-attachment"><!-- END inline_attachment_open -->
|
||||
<!-- BEGIN inline_attachment_close --></div><!-- END inline_attachment_close -->
|
||||
|
||||
<!-- BEGIN b_open --><strong class="text-strong"><!-- END b_open -->
|
||||
<!-- BEGIN b_close --></strong><!-- END b_close -->
|
||||
|
||||
<!-- BEGIN u_open --><span style="text-decoration: underline"><!-- END u_open -->
|
||||
<!-- BEGIN u_close --></span><!-- END u_close -->
|
||||
|
||||
<!-- BEGIN i_open --><em class="text-italics"><!-- END i_open -->
|
||||
<!-- BEGIN i_close --></em><!-- END i_close -->
|
||||
|
||||
<!-- BEGIN color --><span style="color: {COLOR}">{TEXT}</span><!-- END color -->
|
||||
|
||||
<!-- BEGIN size --><span style="font-size: {SIZE}%; line-height: 116%;">{TEXT}</span><!-- END size -->
|
||||
|
||||
<!-- BEGIN img --><img src="{URL}" class="postimage" alt="{L_IMAGE}" /><!-- END img -->
|
||||
|
||||
<!-- BEGIN url --><a href="{URL}" class="postlink">{DESCRIPTION}</a><!-- END url -->
|
||||
|
||||
<!-- BEGIN email -->
|
||||
<a>
|
||||
<xsl:attribute name="href">
|
||||
<xsl:text>mailto:</xsl:text>
|
||||
<xsl:value-of select="@email"/>
|
||||
<xsl:if test="@subject or @body">
|
||||
<xsl:text>?</xsl:text>
|
||||
<xsl:if test="@subject">subject=<xsl:value-of select="@subject"/></xsl:if>
|
||||
<xsl:if test="@body"><xsl:if test="@subject">&</xsl:if>body=<xsl:value-of select="@body"/></xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:attribute>
|
||||
<xsl:apply-templates/>
|
||||
</a>
|
||||
<!-- END email -->
|
||||
|
||||
<!-- BEGIN flash --><object classid="clsid:D27CDB6E-AE6D-11CF-96B8-444553540000" codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=5,0,0,0" width="{WIDTH}" height="{HEIGHT}"><param name="movie" value="{URL}" /><param name="play" value="false" /><param name="loop" value="false" /><param name="quality" value="high" /><param name="allowScriptAccess" value="never" /><param name="allowNetworking" value="internal" /><embed src="{URL}" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" width="{WIDTH}" height="{HEIGHT}" play="false" loop="false" quality="high" allowscriptaccess="never" allownetworking="internal"></embed></object><!-- END flash -->
|
24
public/styles/prosilver/template/captcha_default.html
Normal file
24
public/styles/prosilver/template/captcha_default.html
Normal file
|
@ -0,0 +1,24 @@
|
|||
<!-- IF S_TYPE == 1 -->
|
||||
<div class="panel captcha-panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3 class="captcha-title">{L_CONFIRMATION}</h3>
|
||||
<p>{L_CONFIRM_EXPLAIN}</p>
|
||||
|
||||
<fieldset class="fields2">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<dl>
|
||||
<dt><label for="confirm_code">{L_CONFIRM_CODE}{L_COLON}</label></dt>
|
||||
<dd class="captcha captcha-image"><img src="{CONFIRM_IMAGE_LINK}" alt="{L_CONFIRM_CODE}" /></dd>
|
||||
<dd><input type="text" name="confirm_code" id="confirm_code" size="8" maxlength="8" tabindex="{$CAPTCHA_TAB_INDEX}" class="inputbox narrow" title="{L_CONFIRM_CODE}" />
|
||||
<!-- IF S_CONFIRM_REFRESH --><input type="submit" name="refresh_vc" id="refresh_vc" class="button2" value="{L_VC_REFRESH}" /><!-- ENDIF -->
|
||||
<input type="hidden" name="confirm_id" id="confirm_id" value="{CONFIRM_ID}" /></dd>
|
||||
<dd>{L_CONFIRM_CODE_EXPLAIN}</dd>
|
||||
</dl>
|
||||
|
||||
<!-- IF S_TYPE == 1 -->
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
21
public/styles/prosilver/template/captcha_qa.html
Normal file
21
public/styles/prosilver/template/captcha_qa.html
Normal file
|
@ -0,0 +1,21 @@
|
|||
<!-- IF S_TYPE == 1 -->
|
||||
<div class="panel captcha-panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3 class="captcha-title">{L_CONFIRMATION}</h3>
|
||||
<fieldset class="fields2">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<dl>
|
||||
<dt><label>{QA_CONFIRM_QUESTION}{L_COLON}</label><br /><span>{L_CONFIRM_QUESTION_EXPLAIN}</span></dt>
|
||||
<dd class="captcha">
|
||||
<input type="text" tabindex="{$CAPTCHA_TAB_INDEX}" name="qa_answer" id="answer" size="45" class="inputbox autowidth" title="{L_ANSWER}" />
|
||||
<input type="hidden" name="qa_confirm_id" id="qa_confirm_id" value="{QA_CONFIRM_ID}" />
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
<!-- IF S_TYPE == 1 -->
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
10
public/styles/prosilver/template/captcha_recaptcha.html
Normal file
10
public/styles/prosilver/template/captcha_recaptcha.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
<!-- IF S_RECAPTCHA_AVAILABLE -->
|
||||
<noscript>
|
||||
<div>{L_RECAPTCHA_NOSCRIPT}</div>
|
||||
</noscript>
|
||||
{% INCLUDEJS RECAPTCHA_SERVER ~ '.js?onload=phpbbRecaptchaOnLoad&hl=' ~ lang('RECAPTCHA_LANG') %}
|
||||
{# The g-recaptcha class is used in JavaScript #}
|
||||
<div class="g-recaptcha" data-sitekey="{RECAPTCHA_PUBKEY}" data-callback="phpbbRecaptchaOnSubmit" data-size="invisible" data-tabindex="<!-- IF $CAPTCHA_TAB_INDEX -->{$CAPTCHA_TAB_INDEX}<!-- ELSE -->10<!-- ENDIF -->"></div>
|
||||
<!-- ELSE -->
|
||||
{L_RECAPTCHA_NOT_AVAILABLE}
|
||||
<!-- ENDIF -->
|
13
public/styles/prosilver/template/captcha_recaptcha_v3.html
Normal file
13
public/styles/prosilver/template/captcha_recaptcha_v3.html
Normal file
|
@ -0,0 +1,13 @@
|
|||
{% if S_RECAPTCHA_AVAILABLE %}
|
||||
<noscript>
|
||||
<div>{{ lang('RECAPTCHA_NOSCRIPT') }}</div>
|
||||
</noscript>
|
||||
|
||||
<script src="{{ U_RECAPTCHA_SCRIPT }}" async defer></script>
|
||||
|
||||
{# The g-recaptcha class is used in JavaScript #}
|
||||
<input class="g-recaptcha" type="hidden" name="recaptcha_action" value="{{ RECAPTCHA_ACTION }}" data-recaptcha-v3="{{ RECAPTCHA_KEY }}">
|
||||
<input type="hidden" name="recaptcha_token" value="">
|
||||
{% else %}
|
||||
{{ lang('RECAPTCHA_NOT_AVAILABLE') }}
|
||||
{% endif %}
|
35
public/styles/prosilver/template/confirm_body.html
Normal file
35
public/styles/prosilver/template/confirm_body.html
Normal file
|
@ -0,0 +1,35 @@
|
|||
<!-- IF S_AJAX_REQUEST -->
|
||||
<form action="{S_CONFIRM_ACTION}" method="post">
|
||||
<h3>{MESSAGE_TITLE}</h3>
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="button" name="confirm" value="{L_YES}" class="button2" />
|
||||
<input type="button" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<!-- ELSE -->
|
||||
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h2 class="message-title">{MESSAGE_TITLE}</h2>
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}
|
||||
<input type="submit" name="confirm" value="{L_YES}" class="button2" />
|
||||
<input type="submit" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
|
||||
<!-- ENDIF -->
|
72
public/styles/prosilver/template/confirm_delete_body.html
Normal file
72
public/styles/prosilver/template/confirm_delete_body.html
Normal file
|
@ -0,0 +1,72 @@
|
|||
<!-- IF S_AJAX_REQUEST -->
|
||||
<form action="{S_CONFIRM_ACTION}" method="post">
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
|
||||
<!-- IF not S_SHADOW_TOPICS -->
|
||||
<!-- IF not S_SOFTDELETED and S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
|
||||
<label>
|
||||
<strong>{L_DELETE_PERMANENTLY}{L_COLON}</strong>
|
||||
<input id="delete_permanent" name="delete_permanent" type="checkbox" value="1" {S_CHECKED_PERMANENT} />
|
||||
<!-- IF S_TOPIC_MODE -->{DELETE_TOPIC_PERMANENTLY_EXPLAIN}<!-- ELSE -->{DELETE_POST_PERMANENTLY_EXPLAIN}<!-- ENDIF -->
|
||||
</label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<label for="delete_reason">
|
||||
<strong>{L_DELETE_REASON}{L_COLON}</strong><br /><span>{L_DELETE_REASON_EXPLAIN}</span><br />
|
||||
<input type="text" name="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" />
|
||||
</label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="button" name="confirm" value="{L_YES}" class="button1" />
|
||||
<input type="button" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<!-- ELSE -->
|
||||
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h2 class="message-title">{MESSAGE_TITLE}</h2>
|
||||
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
|
||||
<!-- IF not S_SHADOW_TOPICS -->
|
||||
<fieldset class="fields1">
|
||||
<!-- IF not S_SOFTDELETED and S_ALLOWED_DELETE and S_ALLOWED_SOFTDELETE -->
|
||||
<dl>
|
||||
<dt><label for="delete_permanent">{L_DELETE_PERMANENTLY}{L_COLON}</label></dt>
|
||||
<dd>
|
||||
<label for="delete_permanent">
|
||||
<input id="delete_permanent" name="delete_permanent" type="checkbox" value="1" {S_CHECKED_PERMANENT} />
|
||||
<!-- IF S_TOPIC_MODE -->{DELETE_TOPIC_PERMANENTLY_EXPLAIN}<!-- ELSE -->{DELETE_POST_PERMANENTLY_EXPLAIN}<!-- ENDIF -->
|
||||
</label>
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
{% EVENT confirm_delete_body_delete_reason_before %}
|
||||
|
||||
<dl>
|
||||
<dt><label for="delete_reason">{L_DELETE_REASON}{L_COLON}</label><br /><span>{L_DELETE_REASON_EXPLAIN}</span></dt>
|
||||
<dd><input type="text" name="delete_reason" id="delete_reason" value="" class="inputbox autowidth" maxlength="120" size="45" /></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}
|
||||
<input type="submit" name="confirm" value="{L_YES}" class="button1" />
|
||||
<input type="submit" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
<!-- ENDIF -->
|
27
public/styles/prosilver/template/display_options.html
Normal file
27
public/styles/prosilver/template/display_options.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
<div class="dropdown-container dropdown-container-left dropdown-button-control sort-tools">
|
||||
<span title="{L_SORT_OPTIONS}" class="button button-secondary dropdown-trigger dropdown-select">
|
||||
<i class="icon fa-sort-amount-asc fa-fw" aria-hidden="true"></i>
|
||||
<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
|
||||
</span>
|
||||
<div class="dropdown hidden">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<div class="dropdown-contents">
|
||||
<fieldset class="display-options">
|
||||
<!-- IF S_SORT_OPTIONS -->
|
||||
<label>{L_SORT_BY}{L_COLON} <select name="sk" id="sk">{S_SORT_OPTIONS}</select></label>
|
||||
<label>{L_SORT_DIRECTION}{L_COLON} <select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
|
||||
<hr class="dashed" />
|
||||
<input type="submit" class="button2" name="sort" value="{L_SORT}" />
|
||||
<!-- ELSE -->
|
||||
<label>{L_DISPLAY}{L_COLON} {S_SELECT_SORT_DAYS}</label>
|
||||
<!-- IF S_SELECT_SORT_KEY -->
|
||||
<label>{L_SORT_BY}{L_COLON} {S_SELECT_SORT_KEY}</label>
|
||||
<label>{L_SORT_DIRECTION}{L_COLON} {S_SELECT_SORT_DIR}</label>
|
||||
<!-- ENDIF -->
|
||||
<hr class="dashed" />
|
||||
<input type="submit" class="button2" name="sort" value="{L_GO}" />
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
49
public/styles/prosilver/template/drafts.html
Normal file
49
public/styles/prosilver/template/drafts.html
Normal file
|
@ -0,0 +1,49 @@
|
|||
|
||||
|
||||
<!-- IF .draftrow -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3 class="draft-title">{L_LOAD_DRAFT}</h3>
|
||||
<p>{L_LOAD_DRAFT_EXPLAIN}</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="<!-- IF not S_PRIVMSGS -->forumbg<!-- ELSE -->panel<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
|
||||
<ul class="topiclist two-long-columns">
|
||||
<li class="header">
|
||||
<dl>
|
||||
<dt>{L_LOAD_DRAFT}</dt>
|
||||
<dd class="info">{L_SAVE_DATE}</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist two-long-columns<!-- IF not S_PRIVMSGS --> topics<!-- ELSE --> cplist<!-- ENDIF -->">
|
||||
|
||||
<!-- BEGIN draftrow -->
|
||||
<li class="row<!-- IF draftrow.S_ROW_COUNT is even --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
|
||||
<dl>
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{draftrow.U_INSERT}" title="{L_LOAD_DRAFT}" class="topictitle">{draftrow.DRAFT_SUBJECT}</a><br />
|
||||
<!-- IF not S_PRIVMSGS --><!-- IF draftrow.S_LINK_TOPIC -->{L_TOPIC}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
|
||||
<!-- ELSEIF draftrow.S_LINK_FORUM -->{L_FORUM}{L_COLON} <a href="{draftrow.U_VIEW}">{draftrow.TITLE}</a>
|
||||
<!-- ELSE -->{L_NO_TOPIC_FORUM}<!-- ENDIF --><!-- ENDIF -->
|
||||
<div class="responsive-show" style="display: none;">
|
||||
{L_SAVE_DATE}{L_COLON} <strong>{draftrow.DATE}</strong>
|
||||
</div>
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="info"><span>{draftrow.DATE}</span></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- END draftrow -->
|
||||
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
50
public/styles/prosilver/template/faq_body.html
Normal file
50
public/styles/prosilver/template/faq_body.html
Normal file
|
@ -0,0 +1,50 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<h2 class="faq-title">{L_FAQ_TITLE}</h2>
|
||||
|
||||
|
||||
<div class="panel bg1" id="faqlinks">
|
||||
<div class="inner">
|
||||
<div class="column1">
|
||||
<!-- BEGIN faq_block -->
|
||||
<!-- IF faq_block.SWITCH_COLUMN or (SWITCH_COLUMN_MANUALLY and faq_block.S_ROW_COUNT == 4) -->
|
||||
</div>
|
||||
|
||||
<div class="column2">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<dl class="faq">
|
||||
<dt><strong>{faq_block.BLOCK_TITLE}</strong></dt>
|
||||
<!-- BEGIN faq_row -->
|
||||
<dd><a href="#f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}">{faq_block.faq_row.FAQ_QUESTION}</a></dd>
|
||||
<!-- END faq_row -->
|
||||
</dl>
|
||||
<!-- END faq_block -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- BEGIN faq_block -->
|
||||
<div class="panel <!-- IF faq_block.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<h2 class="faq-title">{faq_block.BLOCK_TITLE}</h2>
|
||||
<!-- BEGIN faq_row -->
|
||||
<dl class="faq">
|
||||
<dt id="f{faq_block.S_ROW_COUNT}r{faq_block.faq_row.S_ROW_COUNT}"><strong>{faq_block.faq_row.FAQ_QUESTION}</strong></dt>
|
||||
<dd>{faq_block.faq_row.FAQ_ANSWER}</dd>
|
||||
</dl>
|
||||
<a href="#faqlinks" class="top">
|
||||
<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i><span>{L_BACK_TO_TOP}</span>
|
||||
</a>
|
||||
<!-- IF not faq_block.faq_row.S_LAST_ROW --><hr class="dashed" /><!-- ENDIF -->
|
||||
<!-- END faq_row -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- END faq_block -->
|
||||
|
||||
<!-- INCLUDE jumpbox.html -->
|
||||
<!-- INCLUDE overall_footer.html -->
|
937
public/styles/prosilver/template/forum_fn.js
Normal file
937
public/styles/prosilver/template/forum_fn.js
Normal file
|
@ -0,0 +1,937 @@
|
|||
/* global phpbb */
|
||||
|
||||
/**
|
||||
* phpBB3 forum functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* Find a member
|
||||
*/
|
||||
function find_username(url) {
|
||||
'use strict';
|
||||
|
||||
popup(url, 760, 570, '_usersearch');
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Window popup
|
||||
*/
|
||||
function popup(url, width, height, name) {
|
||||
'use strict';
|
||||
|
||||
if (!name) {
|
||||
name = '_popup';
|
||||
}
|
||||
|
||||
window.open(url.replace(/&/g, '&'), name, 'height=' + height + ',resizable=yes,scrollbars=yes, width=' + width);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Jump to page
|
||||
*/
|
||||
function pageJump(item) {
|
||||
'use strict';
|
||||
|
||||
var page = parseInt(item.val(), 10),
|
||||
perPage = item.attr('data-per-page'),
|
||||
baseUrl = item.attr('data-base-url'),
|
||||
startName = item.attr('data-start-name');
|
||||
|
||||
if (page !== null && !isNaN(page) && page === Math.floor(page) && page > 0) {
|
||||
if (baseUrl.indexOf('?') === -1) {
|
||||
document.location.href = baseUrl + '?' + startName + '=' + ((page - 1) * perPage);
|
||||
} else {
|
||||
document.location.href = baseUrl.replace(/&/g, '&') + '&' + startName + '=' + ((page - 1) * perPage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark/unmark checklist
|
||||
* id = ID of parent container, name = name prefix, state = state [true/false]
|
||||
*/
|
||||
function marklist(id, name, state) {
|
||||
'use strict';
|
||||
|
||||
jQuery('#' + id + ' input[type=checkbox][name]').each(function() {
|
||||
var $this = jQuery(this);
|
||||
if ($this.attr('name').substr(0, name.length) === name && !$this.prop('disabled')) {
|
||||
$this.prop('checked', state);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize viewable area for attached image or topic review panel (possibly others to come)
|
||||
* e = element
|
||||
*/
|
||||
function viewableArea(e, itself) {
|
||||
'use strict';
|
||||
|
||||
if (!e) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!itself) {
|
||||
e = e.parentNode;
|
||||
}
|
||||
|
||||
if (!e.vaHeight) {
|
||||
// Store viewable area height before changing style to auto
|
||||
e.vaHeight = e.offsetHeight;
|
||||
e.vaMaxHeight = e.style.maxHeight;
|
||||
e.style.height = 'auto';
|
||||
e.style.maxHeight = 'none';
|
||||
e.style.overflow = 'visible';
|
||||
} else {
|
||||
// Restore viewable area height to the default
|
||||
e.style.height = e.vaHeight + 'px';
|
||||
e.style.overflow = 'auto';
|
||||
e.style.maxHeight = e.vaMaxHeight;
|
||||
e.vaHeight = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Alternate display of subPanels
|
||||
*/
|
||||
jQuery(function($) {
|
||||
'use strict';
|
||||
|
||||
$('.sub-panels').each(function() {
|
||||
|
||||
var $childNodes = $('a[data-subpanel]', this),
|
||||
panels = $childNodes.map(function () {
|
||||
return this.getAttribute('data-subpanel');
|
||||
}),
|
||||
showPanel = this.getAttribute('data-show-panel');
|
||||
|
||||
if (panels.length) {
|
||||
activateSubPanel(showPanel, panels);
|
||||
$childNodes.click(function () {
|
||||
activateSubPanel(this.getAttribute('data-subpanel'), panels);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Activate specific subPanel
|
||||
*/
|
||||
function activateSubPanel(p, panels) {
|
||||
'use strict';
|
||||
|
||||
var i, showPanel;
|
||||
|
||||
if (typeof p === 'string') {
|
||||
showPanel = p;
|
||||
}
|
||||
$('input[name="show_panel"]').val(showPanel);
|
||||
|
||||
if (typeof panels === 'undefined') {
|
||||
panels = jQuery('.sub-panels a[data-subpanel]').map(function() {
|
||||
return this.getAttribute('data-subpanel');
|
||||
});
|
||||
}
|
||||
|
||||
for (i = 0; i < panels.length; i++) {
|
||||
jQuery('#' + panels[i]).css('display', panels[i] === showPanel ? 'block' : 'none');
|
||||
jQuery('#' + panels[i] + '-tab').toggleClass('activetab', panels[i] === showPanel);
|
||||
}
|
||||
}
|
||||
|
||||
function selectCode(a) {
|
||||
'use strict';
|
||||
|
||||
// Get ID of code block
|
||||
var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];
|
||||
var s, r;
|
||||
|
||||
// Not IE and IE9+
|
||||
if (window.getSelection) {
|
||||
s = window.getSelection();
|
||||
// Safari and Chrome
|
||||
if (s.setBaseAndExtent) {
|
||||
var l = (e.innerText.length > 1) ? e.innerText.length - 1 : 1;
|
||||
try {
|
||||
s.setBaseAndExtent(e, 0, e, l);
|
||||
} catch (error) {
|
||||
r = document.createRange();
|
||||
r.selectNodeContents(e);
|
||||
s.removeAllRanges();
|
||||
s.addRange(r);
|
||||
}
|
||||
}
|
||||
// Firefox and Opera
|
||||
else {
|
||||
// workaround for bug # 42885
|
||||
if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) === '<BR>') {
|
||||
e.innerHTML = e.innerHTML + ' ';
|
||||
}
|
||||
|
||||
r = document.createRange();
|
||||
r.selectNodeContents(e);
|
||||
s.removeAllRanges();
|
||||
s.addRange(r);
|
||||
}
|
||||
}
|
||||
// Some older browsers
|
||||
else if (document.getSelection) {
|
||||
s = document.getSelection();
|
||||
r = document.createRange();
|
||||
r.selectNodeContents(e);
|
||||
s.removeAllRanges();
|
||||
s.addRange(r);
|
||||
}
|
||||
// IE
|
||||
else if (document.selection) {
|
||||
r = document.body.createTextRange();
|
||||
r.moveToElementText(e);
|
||||
r.select();
|
||||
}
|
||||
}
|
||||
|
||||
var inAutocomplete = false;
|
||||
var lastKeyEntered = '';
|
||||
|
||||
/**
|
||||
* Check event key
|
||||
*/
|
||||
function phpbbCheckKey(event) {
|
||||
'use strict';
|
||||
|
||||
// Keycode is array down or up?
|
||||
if (event.keyCode && (event.keyCode === 40 || event.keyCode === 38)) {
|
||||
inAutocomplete = true;
|
||||
}
|
||||
|
||||
// Make sure we are not within an "autocompletion" field
|
||||
if (inAutocomplete) {
|
||||
// If return pressed and key changed we reset the autocompletion
|
||||
if (!lastKeyEntered || lastKeyEntered === event.which) {
|
||||
inAutocomplete = false;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Keycode is not return, then return. ;)
|
||||
if (event.which !== 13) {
|
||||
lastKeyEntered = event.which;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply onkeypress event for forcing default submit button on ENTER key press
|
||||
*/
|
||||
jQuery(function($) {
|
||||
'use strict';
|
||||
|
||||
$('form input[type=text], form input[type=password]').on('keypress', function (e) {
|
||||
var defaultButton = $(this).parents('form').find('input[type=submit].default-submit-action');
|
||||
|
||||
if (!defaultButton || defaultButton.length <= 0) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (phpbbCheckKey(e)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((e.which && e.which === 13) || (e.keyCode && e.keyCode === 13)) {
|
||||
defaultButton.click();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Functions for user search popup
|
||||
*/
|
||||
function insertUser(formId, value) {
|
||||
'use strict';
|
||||
|
||||
var $form = jQuery(formId),
|
||||
formName = $form.attr('data-form-name'),
|
||||
fieldName = $form.attr('data-field-name'),
|
||||
item = opener.document.forms[formName][fieldName];
|
||||
|
||||
if (item.value.length && item.type === 'textarea') {
|
||||
value = item.value + '\n' + value;
|
||||
}
|
||||
|
||||
item.value = value;
|
||||
}
|
||||
|
||||
function insert_marked_users(formId, users) {
|
||||
'use strict';
|
||||
|
||||
$(users).filter(':checked').each(function() {
|
||||
insertUser(formId, this.value);
|
||||
});
|
||||
|
||||
window.close();
|
||||
}
|
||||
|
||||
function insert_single_user(formId, user) {
|
||||
'use strict';
|
||||
|
||||
insertUser(formId, user);
|
||||
window.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse document block
|
||||
*/
|
||||
function parseDocument($container) {
|
||||
'use strict';
|
||||
|
||||
var test = document.createElement('div'),
|
||||
oldBrowser = (typeof test.style.borderRadius === 'undefined'),
|
||||
$body = $('body');
|
||||
|
||||
/**
|
||||
* Reset avatar dimensions when changing URL or EMAIL
|
||||
*/
|
||||
$container.find('input[data-reset-on-edit]').on('keyup', function() {
|
||||
$(this.getAttribute('data-reset-on-edit')).val('');
|
||||
});
|
||||
|
||||
/**
|
||||
* Pagination
|
||||
*/
|
||||
$container.find('.pagination .page-jump-form :button').click(function() {
|
||||
var $input = $(this).siblings('input.inputbox');
|
||||
pageJump($input);
|
||||
});
|
||||
|
||||
$container.find('.pagination .page-jump-form input.inputbox').on('keypress', function(event) {
|
||||
if (event.which === 13 || event.keyCode === 13) {
|
||||
event.preventDefault();
|
||||
pageJump($(this));
|
||||
}
|
||||
});
|
||||
|
||||
$container.find('.pagination .dropdown-trigger').click(function() {
|
||||
var $dropdownContainer = $(this).parent();
|
||||
// Wait a little bit to make sure the dropdown has activated
|
||||
setTimeout(function() {
|
||||
if ($dropdownContainer.hasClass('dropdown-visible')) {
|
||||
$dropdownContainer.find('input.inputbox').focus();
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
|
||||
/**
|
||||
* Adjust HTML code for IE8 and older versions
|
||||
*/
|
||||
// if (oldBrowser) {
|
||||
// // Fix .linklist.bulletin lists
|
||||
// $container
|
||||
// .find('ul.linklist.bulletin > li')
|
||||
// .filter(':first-child, .rightside:last-child')
|
||||
// .addClass('no-bulletin');
|
||||
// }
|
||||
|
||||
/**
|
||||
* Resize navigation (breadcrumbs) block to keep all links on same line
|
||||
*/
|
||||
$container.find('.navlinks').each(function() {
|
||||
var $this = $(this),
|
||||
$left = $this.children().not('.rightside'),
|
||||
$right = $this.children('.rightside');
|
||||
|
||||
if ($left.length !== 1 || !$right.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
function resize() {
|
||||
var width = 0,
|
||||
diff = $left.outerWidth(true) - $left.width(),
|
||||
minWidth = Math.max($this.width() / 3, 240),
|
||||
maxWidth;
|
||||
|
||||
$right.each(function() {
|
||||
var $this = $(this);
|
||||
if ($this.is(':visible')) {
|
||||
width += $this.outerWidth(true);
|
||||
}
|
||||
});
|
||||
|
||||
maxWidth = $this.width() - width - diff;
|
||||
$left.css('max-width', Math.floor(Math.max(maxWidth, minWidth)) + 'px');
|
||||
}
|
||||
|
||||
resize();
|
||||
$(window).resize(resize);
|
||||
});
|
||||
|
||||
/**
|
||||
* Makes breadcrumbs responsive
|
||||
*/
|
||||
$container.find('.breadcrumbs:not([data-skip-responsive])').each(function() {
|
||||
var $this = $(this),
|
||||
$links = $this.find('.crumb'),
|
||||
length = $links.length,
|
||||
classes = ['wrapped-max', 'wrapped-wide', 'wrapped-medium', 'wrapped-small', 'wrapped-tiny'],
|
||||
classesLength = classes.length,
|
||||
maxHeight = 0,
|
||||
lastWidth = false,
|
||||
wrapped = false;
|
||||
|
||||
// Set tooltips
|
||||
$this.find('a').each(function() {
|
||||
var $link = $(this);
|
||||
$link.attr('title', $link.text());
|
||||
});
|
||||
|
||||
// Function that checks breadcrumbs
|
||||
function check() {
|
||||
var height = $this.height(),
|
||||
width;
|
||||
|
||||
// Test max-width set in code for .navlinks above
|
||||
width = parseInt($this.css('max-width'), 10);
|
||||
if (!width) {
|
||||
width = $body.width();
|
||||
}
|
||||
|
||||
maxHeight = parseInt($this.css('line-height'), 10);
|
||||
$links.each(function() {
|
||||
if ($(this).height() > 0) {
|
||||
maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
|
||||
}
|
||||
});
|
||||
|
||||
if (height <= maxHeight) {
|
||||
if (!wrapped || lastWidth === false || lastWidth >= width) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
lastWidth = width;
|
||||
|
||||
if (wrapped) {
|
||||
$this.removeClass('wrapped').find('.crumb.wrapped').removeClass('wrapped ' + classes.join(' '));
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
wrapped = true;
|
||||
$this.addClass('wrapped');
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (var i = 0; i < classesLength; i++) {
|
||||
for (var j = length - 1; j >= 0; j--) {
|
||||
$links.eq(j).addClass('wrapped ' + classes[i]);
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Run function and set event
|
||||
check();
|
||||
$(window).resize(check);
|
||||
});
|
||||
|
||||
/**
|
||||
* Responsive link lists
|
||||
*/
|
||||
var selector = '.linklist:not(.navlinks, [data-skip-responsive]),' +
|
||||
'.postbody .post-buttons:not([data-skip-responsive])';
|
||||
$container.find(selector).each(function() {
|
||||
var $this = $(this),
|
||||
filterSkip = '.breadcrumbs, [data-skip-responsive]',
|
||||
filterLast = '.edit-icon, .quote-icon, [data-last-responsive]',
|
||||
$linksAll = $this.children(),
|
||||
$linksNotSkip = $linksAll.not(filterSkip), // All items that can potentially be hidden
|
||||
$linksFirst = $linksNotSkip.not(filterLast), // The items that will be hidden first
|
||||
$linksLast = $linksNotSkip.filter(filterLast), // The items that will be hidden last
|
||||
persistent = $this.attr('id') === 'nav-main', // Does this list already have a menu (such as quick-links)?
|
||||
html = '<li class="responsive-menu hidden"><a href="javascript:void(0);" class="js-responsive-menu-link responsive-menu-link"><i class="icon fa-bars fa-fw" aria-hidden="true"></i></a><div class="dropdown"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>',
|
||||
slack = 3; // Vertical slack space (in pixels). Determines how sensitive the script is in determining whether a line-break has occurred.
|
||||
|
||||
// Add a hidden drop-down menu to each links list (except those that already have one)
|
||||
if (!persistent) {
|
||||
if ($linksNotSkip.is('.rightside')) {
|
||||
$linksNotSkip.filter('.rightside:first').before(html);
|
||||
$this.children('.responsive-menu').addClass('rightside');
|
||||
} else {
|
||||
$this.append(html);
|
||||
}
|
||||
}
|
||||
|
||||
// Set some object references and initial states
|
||||
var $menu = $this.children('.responsive-menu'),
|
||||
$menuContents = $menu.find('.dropdown-contents'),
|
||||
persistentContent = $menuContents.find('li:not(.separator)').length,
|
||||
lastWidth = false,
|
||||
compact = false,
|
||||
responsive1 = false,
|
||||
responsive2 = false,
|
||||
copied1 = false,
|
||||
copied2 = false,
|
||||
maxHeight = 0;
|
||||
|
||||
// Find the tallest element in the list (we assume that all elements are roughly the same height)
|
||||
$linksAll.each(function() {
|
||||
if (!$(this).height()) {
|
||||
return;
|
||||
}
|
||||
maxHeight = Math.max(maxHeight, $(this).outerHeight(true));
|
||||
});
|
||||
if (maxHeight < 1) {
|
||||
return; // Shouldn't be possible, but just in case, abort
|
||||
} else {
|
||||
maxHeight = maxHeight + slack;
|
||||
}
|
||||
|
||||
function check() {
|
||||
var width = $body.width();
|
||||
// We can't make it any smaller than this, so just skip
|
||||
if (responsive2 && compact && (width <= lastWidth)) {
|
||||
return;
|
||||
}
|
||||
lastWidth = width;
|
||||
|
||||
// Reset responsive and compact layout
|
||||
if (responsive1 || responsive2) {
|
||||
$linksNotSkip.removeClass('hidden');
|
||||
$menuContents.children('.clone').addClass('hidden');
|
||||
responsive1 = responsive2 = false;
|
||||
}
|
||||
if (compact) {
|
||||
$this.removeClass('compact');
|
||||
compact = false;
|
||||
}
|
||||
|
||||
// Unhide the quick-links menu if it has "persistent" content
|
||||
if (persistent && persistentContent) {
|
||||
$menu.removeClass('hidden');
|
||||
} else {
|
||||
$menu.addClass('hidden');
|
||||
}
|
||||
|
||||
// Nothing to resize if block's height is not bigger than tallest element's height
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
// STEP 1: Compact
|
||||
if (!compact) {
|
||||
$this.addClass('compact');
|
||||
compact = true;
|
||||
}
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
// STEP 2: First responsive set - compact
|
||||
if (compact) {
|
||||
$this.removeClass('compact');
|
||||
compact = false;
|
||||
}
|
||||
// Copy the list items to the dropdown
|
||||
if (!copied1) {
|
||||
var $clones1 = $linksFirst.clone();
|
||||
$menuContents.prepend($clones1.addClass('clone clone-first').removeClass('leftside rightside'));
|
||||
|
||||
if ($this.hasClass('post-buttons')) {
|
||||
$('.button', $menuContents).removeClass('button');
|
||||
$('.sr-only', $menuContents).removeClass('sr-only');
|
||||
$('.js-responsive-menu-link').addClass('button').addClass('button-icon-only');
|
||||
$('.js-responsive-menu-link .icon').removeClass('fa-bars').addClass('fa-ellipsis-h');
|
||||
}
|
||||
copied1 = true;
|
||||
}
|
||||
if (!responsive1) {
|
||||
$linksFirst.addClass('hidden');
|
||||
responsive1 = true;
|
||||
$menuContents.children('.clone-first').removeClass('hidden');
|
||||
$menu.removeClass('hidden');
|
||||
}
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
// STEP 3: First responsive set + compact
|
||||
if (!compact) {
|
||||
$this.addClass('compact');
|
||||
compact = true;
|
||||
}
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
// STEP 4: Last responsive set - compact
|
||||
if (!$linksLast.length) {
|
||||
return; // No other links to hide, can't do more
|
||||
}
|
||||
if (compact) {
|
||||
$this.removeClass('compact');
|
||||
compact = false;
|
||||
}
|
||||
// Copy the list items to the dropdown
|
||||
if (!copied2) {
|
||||
var $clones2 = $linksLast.clone();
|
||||
$menuContents.prepend($clones2.addClass('clone clone-last').removeClass('leftside rightside'));
|
||||
copied2 = true;
|
||||
}
|
||||
if (!responsive2) {
|
||||
$linksLast.addClass('hidden');
|
||||
responsive2 = true;
|
||||
$menuContents.children('.clone-last').removeClass('hidden');
|
||||
}
|
||||
if ($this.height() <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
// STEP 5: Last responsive set + compact
|
||||
if (!compact) {
|
||||
$this.addClass('compact');
|
||||
compact = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!persistent) {
|
||||
phpbb.registerDropdown($menu.find('a.js-responsive-menu-link'), $menu.find('.dropdown'), false);
|
||||
}
|
||||
|
||||
// If there are any images in the links list, run the check again after they have loaded
|
||||
$linksAll.find('img').each(function() {
|
||||
$(this).on('load', function() {
|
||||
check();
|
||||
});
|
||||
});
|
||||
|
||||
check();
|
||||
$(window).resize(check);
|
||||
});
|
||||
|
||||
/**
|
||||
* Do not run functions below for old browsers
|
||||
*/
|
||||
if (oldBrowser) {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjust topiclist lists with check boxes
|
||||
*/
|
||||
$container.find('ul.topiclist dd.mark').siblings('dt').children('.list-inner').addClass('with-mark');
|
||||
|
||||
/**
|
||||
* Appends contents of all extra columns to first column in
|
||||
* .topiclist lists for mobile devices. Copies contents as is.
|
||||
*
|
||||
* To add that functionality to .topiclist list simply add
|
||||
* responsive-show-all to list of classes
|
||||
*/
|
||||
$container.find('.topiclist.responsive-show-all > li > dl').each(function() {
|
||||
var $this = $(this),
|
||||
$block = $this.find('dt .responsive-show:last-child'),
|
||||
first = true;
|
||||
|
||||
// Create block that is visible only on mobile devices
|
||||
if (!$block.length) {
|
||||
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
|
||||
$block = $this.find('dt .responsive-show:last-child');
|
||||
} else {
|
||||
first = ($.trim($block.text()).length === 0);
|
||||
}
|
||||
|
||||
// Copy contents of each column
|
||||
$this.find('dd').not('.mark').each(function() {
|
||||
var column = $(this),
|
||||
$children = column.children(),
|
||||
html = column.html();
|
||||
|
||||
if ($children.length === 1 && $children.text() === column.text()) {
|
||||
html = $children.html();
|
||||
}
|
||||
|
||||
$block.append((first ? '' : '<br />') + html);
|
||||
|
||||
first = false;
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Same as above, but prepends text from header to each
|
||||
* column before contents of that column.
|
||||
*
|
||||
* To add that functionality to .topiclist list simply add
|
||||
* responsive-show-columns to list of classes
|
||||
*/
|
||||
$container.find('.topiclist.responsive-show-columns').each(function() {
|
||||
var $list = $(this),
|
||||
headers = [],
|
||||
headersLength = 0;
|
||||
|
||||
// Find all headers, get contents
|
||||
$list.prev('.topiclist').find('li.header dd').not('.mark').each(function() {
|
||||
headers.push($(this).text());
|
||||
headersLength++;
|
||||
});
|
||||
|
||||
if (!headersLength) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse each row
|
||||
$list.find('dl').each(function() {
|
||||
var $this = $(this),
|
||||
$block = $this.find('dt .responsive-show:last-child'),
|
||||
first = true;
|
||||
|
||||
// Create block that is visible only on mobile devices
|
||||
if (!$block.length) {
|
||||
$this.find('dt > .list-inner').append('<div class="responsive-show" style="display:none;" />');
|
||||
$block = $this.find('dt .responsive-show:last-child');
|
||||
} else {
|
||||
first = ($.trim($block.text()).length === 0);
|
||||
}
|
||||
|
||||
// Copy contents of each column
|
||||
$this.find('dd').not('.mark').each(function(i) {
|
||||
var column = $(this),
|
||||
children = column.children(),
|
||||
html = column.html();
|
||||
|
||||
if (children.length === 1 && children.text() === column.text()) {
|
||||
html = children.html();
|
||||
}
|
||||
|
||||
// Prepend contents of matching header before contents of column
|
||||
if (i < headersLength) {
|
||||
html = headers[i] + ': <strong>' + html + '</strong>';
|
||||
}
|
||||
|
||||
$block.append((first ? '' : '<br />') + html);
|
||||
|
||||
first = false;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Responsive tables
|
||||
*/
|
||||
$container.find('table.table1').not('.not-responsive').each(function() {
|
||||
var $this = $(this),
|
||||
$th = $this.find('thead > tr > th'),
|
||||
headers = [],
|
||||
totalHeaders = 0,
|
||||
i, headersLength;
|
||||
|
||||
// Find each header
|
||||
$th.each(function(column) {
|
||||
var cell = $(this),
|
||||
colspan = parseInt(cell.attr('colspan'), 10),
|
||||
dfn = cell.attr('data-dfn'),
|
||||
text = dfn ? dfn : cell.text();
|
||||
|
||||
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
|
||||
|
||||
for (i = 0; i < colspan; i++) {
|
||||
headers.push(text);
|
||||
}
|
||||
totalHeaders++;
|
||||
|
||||
if (dfn && !column) {
|
||||
$this.addClass('show-header');
|
||||
}
|
||||
});
|
||||
|
||||
headersLength = headers.length;
|
||||
|
||||
// Add header text to each cell as <dfn>
|
||||
$this.addClass('responsive');
|
||||
|
||||
if (totalHeaders < 2) {
|
||||
$this.addClass('show-header');
|
||||
return;
|
||||
}
|
||||
|
||||
$this.find('tbody > tr').each(function() {
|
||||
var row = $(this),
|
||||
cells = row.children('td'),
|
||||
column = 0;
|
||||
|
||||
if (cells.length === 1) {
|
||||
row.addClass('big-column');
|
||||
return;
|
||||
}
|
||||
|
||||
cells.each(function() {
|
||||
var cell = $(this),
|
||||
colspan = parseInt(cell.attr('colspan'), 10),
|
||||
text = $.trim(cell.text());
|
||||
|
||||
if (headersLength <= column) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((text.length && text !== '-') || cell.children().length) {
|
||||
cell.prepend('<dfn style="display: none;">' + headers[column] + '</dfn>');
|
||||
} else {
|
||||
cell.addClass('empty');
|
||||
}
|
||||
|
||||
colspan = isNaN(colspan) || colspan < 1 ? 1 : colspan;
|
||||
column += colspan;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Hide empty responsive tables
|
||||
*/
|
||||
$container.find('table.responsive > tbody').not('.responsive-skip-empty').each(function() {
|
||||
var $items = $(this).children('tr');
|
||||
if (!$items.length) {
|
||||
$(this).parent('table:first').addClass('responsive-hide');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Responsive tabs
|
||||
*/
|
||||
$container.find('#tabs, #minitabs').not('[data-skip-responsive]').each(function() {
|
||||
var $this = $(this),
|
||||
$ul = $this.children(),
|
||||
$tabs = $ul.children().not('[data-skip-responsive]'),
|
||||
$links = $tabs.children('a'),
|
||||
$item = $ul.append('<li class="tab responsive-tab" style="display:none;"><a href="javascript:void(0);" class="responsive-tab-link"> </a><div class="dropdown tab-dropdown" style="display: none;"><div class="pointer"><div class="pointer-inner"></div></div><ul class="dropdown-contents" /></div></li>').find('li.responsive-tab'),
|
||||
$menu = $item.find('.dropdown-contents'),
|
||||
maxHeight = 0,
|
||||
lastWidth = false,
|
||||
responsive = false;
|
||||
|
||||
$links.each(function() {
|
||||
var $this = $(this);
|
||||
maxHeight = Math.max(maxHeight, Math.max($this.outerHeight(true), $this.parent().outerHeight(true)));
|
||||
});
|
||||
|
||||
function check() {
|
||||
var width = $body.width(),
|
||||
height = $this.height();
|
||||
|
||||
if (!arguments.length && (!responsive || width <= lastWidth) && height <= maxHeight) {
|
||||
return;
|
||||
}
|
||||
|
||||
$tabs.show();
|
||||
$item.hide();
|
||||
|
||||
lastWidth = width;
|
||||
height = $this.height();
|
||||
if (height <= maxHeight) {
|
||||
if ($item.hasClass('dropdown-visible')) {
|
||||
phpbb.toggleDropdown.call($item.find('a.responsive-tab-link').get(0));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
responsive = true;
|
||||
$item.show();
|
||||
$menu.html('');
|
||||
|
||||
var $availableTabs = $tabs.filter(':not(.activetab, .responsive-tab)'),
|
||||
total = $availableTabs.length,
|
||||
i, $tab;
|
||||
|
||||
for (i = total - 1; i >= 0; i--) {
|
||||
$tab = $availableTabs.eq(i);
|
||||
$menu.prepend($tab.clone(true).removeClass('tab'));
|
||||
$tab.hide();
|
||||
if ($this.height() <= maxHeight) {
|
||||
$menu.find('a').click(function() {
|
||||
check(true);
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
$menu.find('a').click(function() {
|
||||
check(true);
|
||||
});
|
||||
}
|
||||
|
||||
var $tabLink = $item.find('a.responsive-tab-link');
|
||||
phpbb.registerDropdown($tabLink, $item.find('.dropdown'), {
|
||||
visibleClass: 'activetab'
|
||||
});
|
||||
|
||||
check(true);
|
||||
$(window).resize(check);
|
||||
});
|
||||
|
||||
/**
|
||||
* Hide UCP/MCP navigation if there is only 1 item
|
||||
*/
|
||||
$container.find('#navigation').each(function() {
|
||||
var $items = $(this).children('ol, ul').children('li');
|
||||
if ($items.length === 1) {
|
||||
$(this).addClass('responsive-hide');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* Replace responsive text
|
||||
*/
|
||||
$container.find('[data-responsive-text]').each(function() {
|
||||
var $this = $(this),
|
||||
fullText = $this.text(),
|
||||
responsiveText = $this.attr('data-responsive-text'),
|
||||
responsive = false;
|
||||
|
||||
function check() {
|
||||
if ($(window).width() > 700) {
|
||||
if (!responsive) {
|
||||
return;
|
||||
}
|
||||
$this.text(fullText);
|
||||
responsive = false;
|
||||
return;
|
||||
}
|
||||
if (responsive) {
|
||||
return;
|
||||
}
|
||||
$this.text(responsiveText);
|
||||
responsive = true;
|
||||
}
|
||||
|
||||
check();
|
||||
$(window).resize(check);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Run onload functions
|
||||
*/
|
||||
jQuery(function($) {
|
||||
'use strict';
|
||||
|
||||
// Swap .nojs and .hasjs
|
||||
$('#phpbb.nojs').toggleClass('nojs hasjs');
|
||||
$('#phpbb').toggleClass('hastouch', phpbb.isTouch);
|
||||
$('#phpbb.hastouch').removeClass('notouch');
|
||||
|
||||
// Focus forms
|
||||
$('form[data-focus]:first').each(function() {
|
||||
$('#' + this.getAttribute('data-focus')).focus();
|
||||
});
|
||||
|
||||
parseDocument($('body'));
|
||||
});
|
137
public/styles/prosilver/template/forumlist_body.html
Normal file
137
public/styles/prosilver/template/forumlist_body.html
Normal file
|
@ -0,0 +1,137 @@
|
|||
|
||||
<!-- BEGIN forumrow -->
|
||||
<!-- IF (forumrow.S_IS_CAT and not forumrow.S_FIRST_ROW) or forumrow.S_NO_CAT -->
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT forumlist_body_category_header_before -->
|
||||
<!-- IF forumrow.S_IS_CAT or forumrow.S_FIRST_ROW or forumrow.S_NO_CAT -->
|
||||
<div class="forabg">
|
||||
<div class="inner">
|
||||
<ul class="topiclist">
|
||||
<li class="header">
|
||||
<!-- EVENT forumlist_body_category_header_row_prepend -->
|
||||
<dl class="row-item">
|
||||
<dt><div class="list-inner"><!-- IF forumrow.S_IS_CAT --><a href="{forumrow.U_VIEWFORUM}">{forumrow.FORUM_NAME}</a><!-- ELSE -->{L_FORUM}<!-- ENDIF --></div></dt>
|
||||
<dd class="topics">{L_TOPICS}</dd>
|
||||
<dd class="posts">{L_POSTS}</dd>
|
||||
<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
|
||||
</dl>
|
||||
<!-- EVENT forumlist_body_category_header_row_append -->
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist forums">
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT forumlist_body_category_header_after -->
|
||||
|
||||
<!-- IF not forumrow.S_IS_CAT -->
|
||||
<!-- EVENT forumlist_body_forum_row_before -->
|
||||
<li class="row">
|
||||
<!-- EVENT forumlist_body_forum_row_prepend -->
|
||||
<dl class="row-item {forumrow.FORUM_IMG_STYLE}">
|
||||
<dt title="{forumrow.FORUM_FOLDER_IMG_ALT}">
|
||||
<!-- IF forumrow.S_UNREAD_FORUM --><a href="{forumrow.U_VIEWFORUM}" class="row-item-link"></a><!-- ENDIF -->
|
||||
<div class="list-inner">
|
||||
<!-- IF S_ENABLE_FEEDS and forumrow.S_FEED_ENABLED -->
|
||||
<!--
|
||||
<a class="feed-icon-forum" title="{L_FEED} - {forumrow.FORUM_NAME}" href="{U_FEED}?f={forumrow.FORUM_ID}">
|
||||
<i class="icon fa-rss-square fa-fw icon-orange" aria-hidden="true"></i><span class="sr-only">{L_FEED} - {forumrow.FORUM_NAME}</span>
|
||||
</a>
|
||||
-->
|
||||
<!-- ENDIF -->
|
||||
<!-- IF forumrow.FORUM_IMAGE -->
|
||||
<!-- EVENT forumlist_body_forum_image_before -->
|
||||
<span class="forum-image"><!-- EVENT forumlist_body_forum_image_prepend -->{forumrow.FORUM_IMAGE}<!-- EVENT forumlist_body_forum_image_append --></span>
|
||||
<!-- EVENT forumlist_body_forum_image_after -->
|
||||
<!-- ENDIF -->
|
||||
<a href="{forumrow.U_VIEWFORUM}" class="forumtitle">{forumrow.FORUM_NAME}</a>
|
||||
<!-- IF forumrow.FORUM_DESC --><br />{forumrow.FORUM_DESC}<!-- ENDIF -->
|
||||
<!-- IF forumrow.MODERATORS -->
|
||||
<br /><strong>{forumrow.L_MODERATOR_STR}{L_COLON}</strong> {forumrow.MODERATORS}
|
||||
<!-- ENDIF -->
|
||||
<!-- IF .forumrow.subforum and forumrow.S_LIST_SUBFORUMS -->
|
||||
<!-- EVENT forumlist_body_subforums_before -->
|
||||
<br /><strong>{forumrow.L_SUBFORUM_STR}{L_COLON}</strong>
|
||||
<!-- BEGIN subforum -->
|
||||
<!-- EVENT forumlist_body_subforum_link_prepend --><a href="{forumrow.subforum.U_SUBFORUM}" class="subforum<!-- IF forumrow.subforum.S_UNREAD --> unread<!-- ELSE --> read<!-- ENDIF -->" title="<!-- IF forumrow.subforum.S_UNREAD -->{L_UNREAD_POSTS}<!-- ELSE -->{L_NO_UNREAD_POSTS}<!-- ENDIF -->">
|
||||
<i class="icon <!-- IF forumrow.subforum.IS_LINK -->fa-external-link<!-- ELSE -->fa-file-o<!-- ENDIF --> fa-fw <!-- IF forumrow.subforum.S_UNREAD --> icon-red<!-- ELSE --> icon-blue<!-- ENDIF --> icon-md" aria-hidden="true"></i>{forumrow.subforum.SUBFORUM_NAME}</a><!-- IF not forumrow.subforum.S_LAST_ROW -->{L_COMMA_SEPARATOR}<!-- ENDIF --><!-- EVENT forumlist_body_subforum_link_append -->
|
||||
<!-- END subforum -->
|
||||
<!-- EVENT forumlist_body_subforums_after -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_IS_BOT -->
|
||||
<div class="responsive-show" style="display: none;">
|
||||
<!-- IF forumrow.CLICKS -->
|
||||
{L_REDIRECTS}{L_COLON} <strong>{forumrow.CLICKS}</strong>
|
||||
<!-- ELSEIF not forumrow.S_IS_LINK and forumrow.TOPICS -->
|
||||
{L_TOPICS}{L_COLON} <strong>{forumrow.TOPICS}</strong>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</dt>
|
||||
<!-- IF forumrow.CLICKS -->
|
||||
<dd class="redirect"><span>{L_REDIRECTS}{L_COLON} {forumrow.CLICKS}</span></dd>
|
||||
<!-- ELSEIF not forumrow.S_IS_LINK -->
|
||||
<dd class="topics">{forumrow.TOPICS} <dfn>{L_TOPICS}</dfn></dd>
|
||||
<dd class="posts">{forumrow.POSTS} <dfn>{L_POSTS}</dfn></dd>
|
||||
<dd class="lastpost">
|
||||
<span>
|
||||
<!-- IF forumrow.U_UNAPPROVED_TOPICS -->
|
||||
<a href="{forumrow.U_UNAPPROVED_TOPICS}" title="{L_TOPICS_UNAPPROVED}">
|
||||
<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPICS_UNAPPROVED}</span>
|
||||
</a>
|
||||
<!-- ELSEIF forumrow.U_UNAPPROVED_POSTS -->
|
||||
<a href="{forumrow.U_UNAPPROVED_POSTS}" title="{L_POSTS_UNAPPROVED_FORUM}">
|
||||
<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_POSTS_UNAPPROVED_FORUM}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF forumrow.LAST_POST_TIME -->
|
||||
<dfn>{L_LAST_POST}</dfn>
|
||||
<!-- IF forumrow.S_DISPLAY_SUBJECT -->
|
||||
<!-- EVENT forumlist_body_last_post_title_prepend -->
|
||||
<a href="{forumrow.U_LAST_POST}" title="{forumrow.LAST_POST_SUBJECT}" class="lastsubject">{forumrow.LAST_POST_SUBJECT_TRUNCATED}</a> <br />
|
||||
<!-- ENDIF -->
|
||||
{L_POST_BY_AUTHOR} <!-- EVENT forumlist_body_last_poster_username_prepend -->{forumrow.LAST_POSTER_FULL}<!-- EVENT forumlist_body_last_poster_username_append -->
|
||||
<!-- IF not S_IS_BOT -->
|
||||
<a href="{forumrow.U_LAST_POST}" title="{L_VIEW_LATEST_POST}">
|
||||
<i class="icon fa-external-link-square fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{L_VIEW_LATEST_POST}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
<br /><time datetime="{forumrow.LAST_POST_TIME_RFC3339}">{forumrow.LAST_POST_TIME}</time>
|
||||
<!-- ELSE -->
|
||||
{% if forumrow.U_UNAPPROVED_TOPICS %}
|
||||
{{ lang('TOPIC_UNAPPROVED_FORUM', forumrow.TOPICS) }}
|
||||
{% else %}
|
||||
{{ lang('NO_POSTS') }}
|
||||
{% endif %}
|
||||
<!-- ENDIF -->
|
||||
</span>
|
||||
</dd>
|
||||
<!-- ELSE -->
|
||||
<dd> </dd>
|
||||
<!-- ENDIF -->
|
||||
</dl>
|
||||
<!-- EVENT forumlist_body_forum_row_append -->
|
||||
</li>
|
||||
<!-- EVENT forumlist_body_forum_row_after -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF forumrow.S_LAST_ROW -->
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- EVENT forumlist_body_last_row_after -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- BEGINELSE -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<strong>{L_NO_FORUMS}</strong>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END forumrow -->
|
0
public/styles/prosilver/template/index.htm
Normal file
0
public/styles/prosilver/template/index.htm
Normal file
80
public/styles/prosilver/template/index_body.html
Normal file
80
public/styles/prosilver/template/index_body.html
Normal file
|
@ -0,0 +1,80 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<p class="{S_CONTENT_FLOW_END} responsive-center time<!-- IF S_USER_LOGGED_IN --> rightside<!-- ENDIF -->"><!-- IF S_USER_LOGGED_IN -->{LAST_VISIT_DATE}<!-- ELSE -->{CURRENT_TIME}<!-- ENDIF --></p>
|
||||
<!-- IF S_USER_LOGGED_IN --><p class="responsive-center time">{CURRENT_TIME}</p><!-- ENDIF -->
|
||||
|
||||
<!-- EVENT index_body_markforums_before -->
|
||||
<!-- IF U_MARK_FORUMS -->
|
||||
<div class="action-bar compact">
|
||||
<a href="{U_MARK_FORUMS}" class="mark-read rightside" accesskey="m" data-ajax="mark_forums_read">{L_MARK_FORUMS_READ}</a>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT index_body_markforums_after -->
|
||||
|
||||
<!-- INCLUDE forumlist_body.html -->
|
||||
|
||||
<!-- EVENT index_body_forumlist_body_after -->
|
||||
|
||||
<!-- IF not S_USER_LOGGED_IN and not S_IS_BOT -->
|
||||
<form method="post" action="{S_LOGIN_ACTION}" class="headerspace">
|
||||
<h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED --> • <a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3>
|
||||
<fieldset class="quick-login">
|
||||
<label for="username"><span>{L_USERNAME}{L_COLON}</span> <input type="text" tabindex="1" name="username" id="username" size="10" class="inputbox" title="{L_USERNAME}" /></label>
|
||||
<label for="password"><span>{L_PASSWORD}{L_COLON}</span> <input type="password" tabindex="2" name="password" id="password" size="10" class="inputbox" title="{L_PASSWORD}" autocomplete="off" /></label>
|
||||
<!-- IF U_SEND_PASSWORD -->
|
||||
<a href="{U_SEND_PASSWORD}">{L_FORGOT_PASS}</a>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_AUTOLOGIN_ENABLED -->
|
||||
<span class="responsive-hide">|</span> <label for="autologin">{L_LOG_ME_IN} <input type="checkbox" tabindex="4" name="autologin" id="autologin" /></label>
|
||||
<!-- ENDIF -->
|
||||
<input type="submit" tabindex="5" name="login" value="{L_LOGIN}" class="button2" />
|
||||
{S_LOGIN_REDIRECT}
|
||||
{S_FORM_TOKEN_LOGIN}
|
||||
</fieldset>
|
||||
</form>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT index_body_stat_blocks_before -->
|
||||
|
||||
<!-- IF S_DISPLAY_ONLINE_LIST -->
|
||||
<div class="stat-block online-list">
|
||||
<!-- IF U_VIEWONLINE --><h3><a href="{U_VIEWONLINE}">{L_WHO_IS_ONLINE}</a></h3><!-- ELSE --><h3>{L_WHO_IS_ONLINE}</h3><!-- ENDIF -->
|
||||
<p>
|
||||
<!-- EVENT index_body_block_online_prepend -->
|
||||
{TOTAL_USERS_ONLINE} ({L_ONLINE_EXPLAIN})<br />{RECORD_USERS}<br />
|
||||
<!-- IF U_VIEWONLINE -->
|
||||
<br />{LOGGED_IN_USER_LIST}
|
||||
<!-- IF LEGEND --><br /><em>{L_LEGEND}{L_COLON} {LEGEND}</em><!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT index_body_block_online_append -->
|
||||
</p>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT index_body_birthday_block_before -->
|
||||
|
||||
<!-- IF S_DISPLAY_BIRTHDAY_LIST -->
|
||||
<div class="stat-block birthday-list">
|
||||
<h3>{L_BIRTHDAYS}</h3>
|
||||
<p>
|
||||
<!-- EVENT index_body_block_birthday_prepend -->
|
||||
<!-- IF .birthdays -->{L_CONGRATULATIONS}{L_COLON} <strong><!-- BEGIN birthdays -->{birthdays.USERNAME}<!-- IF birthdays.AGE !== '' --> ({birthdays.AGE})<!-- ENDIF --><!-- IF not birthdays.S_LAST_ROW -->, <!-- ENDIF --><!-- END birthdays --></strong><!-- ELSE -->{L_NO_BIRTHDAYS}<!-- ENDIF -->
|
||||
<!-- EVENT index_body_block_birthday_append -->
|
||||
</p>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF NEWEST_USER -->
|
||||
<div class="stat-block statistics">
|
||||
<h3>{L_STATISTICS}</h3>
|
||||
<p>
|
||||
<!-- EVENT index_body_block_stats_prepend -->
|
||||
{TOTAL_POSTS} • {TOTAL_TOPICS} • {TOTAL_USERS} • {NEWEST_USER}
|
||||
<!-- EVENT index_body_block_stats_append -->
|
||||
</p>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT index_body_stat_blocks_after -->
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
50
public/styles/prosilver/template/jumpbox.html
Normal file
50
public/styles/prosilver/template/jumpbox.html
Normal file
|
@ -0,0 +1,50 @@
|
|||
|
||||
<div class="action-bar actions-jump">
|
||||
<!-- IF S_VIEWTOPIC -->
|
||||
<p class="jumpbox-return">
|
||||
<a href="{U_VIEW_FORUM}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_FORUM}</span>
|
||||
</a>
|
||||
</p>
|
||||
<!-- ELSEIF S_VIEWFORUM -->
|
||||
<p class="jumpbox-return">
|
||||
<a href="{U_INDEX}" class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_INDEX}</span>
|
||||
</a>
|
||||
</p>
|
||||
<!-- ELSEIF SEARCH_TOPIC -->
|
||||
<p class="jumpbox-return">
|
||||
<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH_TOPIC}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_TO_TOPIC}</span>
|
||||
</a>
|
||||
</p>
|
||||
<!-- ELSEIF S_SEARCH_ACTION -->
|
||||
<p class="jumpbox-return">
|
||||
<a class="left-box arrow-{S_CONTENT_FLOW_BEGIN}" href="{U_SEARCH}" title="{L_SEARCH_ADV}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_GO_TO_SEARCH_ADV}</span>
|
||||
</a>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_DISPLAY_JUMPBOX -->
|
||||
<div class="jumpbox dropdown-container dropdown-container-right<!-- IF not S_IN_MCP --> dropdown-up<!-- ENDIF --> dropdown-{S_CONTENT_FLOW_BEGIN} dropdown-button-control" id="jumpbox">
|
||||
<span title="<!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF -->" class="button button-secondary dropdown-trigger dropdown-select">
|
||||
<span><!-- IF S_IN_MCP and S_MERGE_SELECT -->{L_SELECT_TOPICS_FROM}<!-- ELSEIF S_IN_MCP -->{L_MODERATE_FORUM}<!-- ELSE -->{L_JUMP_TO}<!-- ENDIF --></span>
|
||||
<span class="caret"><i class="icon fa-sort-down fa-fw" aria-hidden="true"></i></span>
|
||||
</span>
|
||||
<div class="dropdown">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<ul class="dropdown-contents">
|
||||
<!-- BEGIN jumpbox_forums -->
|
||||
<!-- IF jumpbox_forums.FORUM_ID neq -1 -->
|
||||
<li><a href="{jumpbox_forums.LINK}" class="<!-- IF jumpbox_forums.level -->jumpbox-sub-link<!-- ELSEIF jumpbox_forums.S_IS_CAT -->jumpbox-cat-link<!-- ELSE -->jumpbox-forum-link<!-- ENDIF -->"><!-- BEGIN level --><span class="spacer"></span><!-- END level --> <span><!-- IF jumpbox_forums.level --><!-- IF S_CONTENT_DIRECTION eq 'rtl' -->↲<!-- ELSE -->↳<!-- ENDIF --> <!-- ENDIF --> {jumpbox_forums.FORUM_NAME}</span></a></li>
|
||||
<!-- ENDIF -->
|
||||
<!-- END jumpbox_forums -->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ELSE -->
|
||||
<br /><br />
|
||||
<!-- ENDIF -->
|
||||
</div>
|
69
public/styles/prosilver/template/login_body.html
Normal file
69
public/styles/prosilver/template/login_body.html
Normal file
|
@ -0,0 +1,69 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<form action="{S_LOGIN_ACTION}" method="post" id="login" data-focus="<!-- IF S_ADMIN_AUTH -->{PASSWORD_CREDENTIAL}<!-- ELSE -->{USERNAME_CREDENTIAL}<!-- ENDIF -->">
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<h2 class="login-title"><!-- IF LOGIN_EXPLAIN -->{LOGIN_EXPLAIN}<!-- ELSE -->{L_LOGIN}<!-- ENDIF --></h2>
|
||||
|
||||
<fieldset <!-- IF not S_CONFIRM_CODE -->class="fields1"<!-- ELSE -->class="fields2"<!-- ENDIF -->>
|
||||
<!-- IF LOGIN_ERROR --><div class="error">{LOGIN_ERROR}</div><!-- ENDIF -->
|
||||
<dl>
|
||||
<dt><label for="{USERNAME_CREDENTIAL}">{L_USERNAME}{L_COLON}</label></dt>
|
||||
<dd><input type="text" tabindex="1" name="{USERNAME_CREDENTIAL}" id="{USERNAME_CREDENTIAL}" size="25" value="{USERNAME}" class="inputbox autowidth" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="{PASSWORD_CREDENTIAL}">{L_PASSWORD}{L_COLON}</label></dt>
|
||||
<dd><input type="password" tabindex="2" id="{PASSWORD_CREDENTIAL}" name="{PASSWORD_CREDENTIAL}" size="25" class="inputbox autowidth" autocomplete="off" /></dd>
|
||||
<!-- IF S_DISPLAY_FULL_LOGIN and (U_SEND_PASSWORD or U_RESEND_ACTIVATION) -->
|
||||
<!-- IF U_SEND_PASSWORD --><dd><a href="{U_SEND_PASSWORD}">{L_FORGOT_PASS}</a></dd><!-- ENDIF -->
|
||||
<!-- IF U_RESEND_ACTIVATION --><dd><a href="{U_RESEND_ACTIVATION}">{L_RESEND_ACTIVATION}</a></dd><!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
</dl>
|
||||
<!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
|
||||
<!-- DEFINE $CAPTCHA_TAB_INDEX = 3 -->
|
||||
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_DISPLAY_FULL_LOGIN -->
|
||||
<dl>
|
||||
<!-- IF S_AUTOLOGIN_ENABLED --><dd><label for="autologin"><input type="checkbox" name="autologin" id="autologin" tabindex="4" /> {L_LOG_ME_IN}</label></dd><!-- ENDIF -->
|
||||
<dd><label for="viewonline"><input type="checkbox" name="viewonline" id="viewonline" tabindex="5" /> {L_HIDE_ME}</label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
{S_LOGIN_REDIRECT}
|
||||
{S_FORM_TOKEN_LOGIN}
|
||||
<dl>
|
||||
<dt> </dt>
|
||||
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" tabindex="6" value="{L_LOGIN}" class="button1" /></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
<!-- IF not S_ADMIN_AUTH and PROVIDER_TEMPLATE_FILE -->
|
||||
<!-- INCLUDE {PROVIDER_TEMPLATE_FILE} -->
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- IF not S_ADMIN_AUTH and S_REGISTER_ENABLED -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<h3>{L_REGISTER}</h3>
|
||||
<p>{L_LOGIN_INFO}</p>
|
||||
<p><strong><a href="{U_TERMS_USE}">{L_TERMS_USE}</a> | <a href="{U_PRIVACY}">{L_PRIVACY}</a></strong></p>
|
||||
<hr class="dashed" />
|
||||
<p><a href="{U_REGISTER}" class="button2">{L_REGISTER}</a></p>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
6
public/styles/prosilver/template/login_body_oauth.html
Normal file
6
public/styles/prosilver/template/login_body_oauth.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
<br>
|
||||
<div class="content">
|
||||
{% for oauth in oauth %}
|
||||
<a href="{{ oauth.REDIRECT_URL }}" class="button2">{{ oauth.SERVICE_NAME }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
42
public/styles/prosilver/template/login_forum.html
Normal file
42
public/styles/prosilver/template/login_forum.html
Normal file
|
@ -0,0 +1,42 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<!-- IF FORUM_NAME --><h2 class="forum-title"><a href="{U_VIEW_FORUM}">{FORUM_NAME}</a></h2><!-- ENDIF -->
|
||||
|
||||
<form id="login_forum" method="post" action="{S_LOGIN_ACTION}">
|
||||
{S_FORM_TOKEN}
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<h2 class="login-title">{L_LOGIN}</h2>
|
||||
|
||||
<p>{L_LOGIN_FORUM}</p>
|
||||
|
||||
<fieldset class="fields1">
|
||||
<!-- IF LOGIN_ERROR -->
|
||||
<dl>
|
||||
<dt> </dt>
|
||||
<dd class="error">{LOGIN_ERROR}</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<dl>
|
||||
<dt><label for="password">{L_PASSWORD}{L_COLON}</label></dt>
|
||||
<dd><input type="password" tabindex="1" id="password" name="password" size="25" class="inputbox narrow" autocomplete="off" /></dd>
|
||||
</dl>
|
||||
{S_LOGIN_REDIRECT}
|
||||
{S_FORM_TOKEN_LOGIN}
|
||||
<dl>
|
||||
<dt> </dt>
|
||||
<dd>{S_HIDDEN_FIELDS}<input type="submit" name="login" id="login" class="button1" value="{L_LOGIN}" tabindex="2" /></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE jumpbox.html -->
|
||||
<!-- INCLUDE overall_footer.html -->
|
81
public/styles/prosilver/template/mcp_approve.html
Normal file
81
public/styles/prosilver/template/mcp_approve.html
Normal file
|
@ -0,0 +1,81 @@
|
|||
<!-- IF S_AJAX_REQUEST -->
|
||||
|
||||
<h3>{MESSAGE_TITLE}</h3>
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
|
||||
<!-- IF S_NOTIFY_POSTER -->
|
||||
<label><input type="checkbox" name="notify_poster" checked="checked" /> <!-- IF S_APPROVE -->{L_NOTIFY_POSTER_APPROVAL}<!-- ELSE -->{L_NOTIFY_POSTER_DISAPPROVAL}<!-- ENDIF --></label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_APPROVE and not S_RESTORE and .reason -->
|
||||
<label><strong>{L_DISAPPROVE_REASON}{L_COLON}</strong>
|
||||
<select name="reason_id">
|
||||
<!-- BEGIN reason --><option value="{reason.ID}"<!-- IF reason.S_SELECTED --> selected="selected"<!-- ENDIF -->>{reason.DESCRIPTION}</option><!-- END reason -->
|
||||
</select></label>
|
||||
|
||||
<label><strong>{L_MORE_INFO}{L_COLON}</strong><br /><span>{L_CAN_LEAVE_BLANK}</span>
|
||||
<textarea class="inputbox" name="reason" id="reason" rows="4" cols="40">{REASON}</textarea>
|
||||
</label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="button" name="confirm" value="{YES_VALUE}" class="button1" />
|
||||
<input type="button" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
|
||||
<!-- ELSE -->
|
||||
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
|
||||
<div class="panel">
|
||||
{S_FORM_TOKEN}
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
|
||||
<h2 class="message-title">{MESSAGE_TITLE}</h2>
|
||||
<!-- IF ADDITIONAL_MSG --><p class="error">{ADDITIONAL_MSG}</p><!-- ENDIF -->
|
||||
|
||||
<fieldset>
|
||||
<!-- IF S_NOTIFY_POSTER -->
|
||||
<dl class="fields2 nobg">
|
||||
<dt> </dt>
|
||||
<dd><label><input type="checkbox" name="notify_poster" checked="checked" /> <!-- IF S_APPROVE -->{L_NOTIFY_POSTER_APPROVAL}<!-- ELSE -->{L_NOTIFY_POSTER_DISAPPROVAL}<!-- ENDIF --></label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_APPROVE and not S_RESTORE and .reason -->
|
||||
<dl class="fields2 nobg">
|
||||
<dt><label>{L_DISAPPROVE_REASON}{L_COLON}</label></dt>
|
||||
<dd><select name="reason_id">
|
||||
<!-- BEGIN reason --><option value="{reason.ID}"<!-- IF reason.S_SELECTED --> selected="selected"<!-- ENDIF -->>{reason.DESCRIPTION}</option><!-- END reason -->
|
||||
</select>
|
||||
</dd>
|
||||
</dl>
|
||||
<dl class="fields2 nobg">
|
||||
<dt><label for="reason">{L_MORE_INFO}{L_COLON}</label><br /><span>{L_CAN_LEAVE_BLANK}</span></dt>
|
||||
<dd><textarea class="inputbox" name="reason" id="reason" rows="4" cols="40">{REASON}</textarea></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<dl class="fields2 nobg">
|
||||
<dt> </dt>
|
||||
<dd><strong>{MESSAGE_TEXT}</strong></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="button1" />
|
||||
<input type="submit" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
<!-- ENDIF -->
|
135
public/styles/prosilver/template/mcp_ban.html
Normal file
135
public/styles/prosilver/template/mcp_ban.html
Normal file
|
@ -0,0 +1,135 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<script>
|
||||
var ban_length = new Array();
|
||||
ban_length[-1] = '';
|
||||
var ban_reason = new Array();
|
||||
ban_reason[-1] = '';
|
||||
var ban_give_reason = new Array();
|
||||
ban_give_reason[-1] = '';
|
||||
|
||||
<!-- BEGIN bans -->
|
||||
ban_length['{bans.BAN_ID}'] = '{{ bans.A_LENGTH }}';
|
||||
<!-- IF bans.A_REASON -->
|
||||
ban_reason['{bans.BAN_ID}'] = '{{ bans.REASON | e('js') }}';
|
||||
<!-- ENDIF -->
|
||||
<!-- IF bans.A_GIVE_REASON -->
|
||||
ban_give_reason['{bans.BAN_ID}'] = '{{ bans.GIVE_REASON | e('js') }}';
|
||||
<!-- ENDIF -->
|
||||
<!-- END bans -->
|
||||
|
||||
function display_details(option)
|
||||
{
|
||||
document.getElementById('unbanlength').innerHTML = ban_length[option];
|
||||
if (option in ban_reason) {
|
||||
document.getElementById('unbanreason').innerHTML = ban_reason[option];
|
||||
} else {
|
||||
document.getElementById('unbanreason').innerHTML = '';
|
||||
}
|
||||
if (option in ban_give_reason) {
|
||||
document.getElementById('unbangivereason').innerHTML = ban_give_reason[option];
|
||||
} else {
|
||||
document.getElementById('unbangivereason').innerHTML = '';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<form id="mcp_ban" method="post" action="{U_ACTION}">
|
||||
|
||||
<h2>{L_TITLE}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_TITLE}</h3>
|
||||
<p>{L_EXPLAIN}</p>
|
||||
|
||||
<fieldset>
|
||||
<!-- EVENT mcp_ban_fields_before -->
|
||||
<dl>
|
||||
<dt><label for="ban">{L_BAN_CELL}{L_COLON}</label></dt>
|
||||
<dd><label for="ban"><textarea name="ban" id="ban" class="inputbox" cols="40" rows="3">{BAN_QUANTIFIER}</textarea></label></dd>
|
||||
<!-- IF S_USERNAME_BAN --><dd><strong><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></strong></dd><!-- ENDIF -->
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="banlength">{L_BAN_LENGTH}{L_COLON}</label></dt>
|
||||
<dd><label for="banlength"><select name="banlength" id="banlength" onchange="if(this.value==-1){document.getElementById('banlengthother').style.display = 'block';}else{document.getElementById('banlengthother').style.display='none';}">{S_BAN_END_OPTIONS}</select></label></dd>
|
||||
<dd id="banlengthother" style="display: none;"><label><input type="text" name="banlengthother" class="inputbox" /><br /><span>{L_YEAR_MONTH_DAY}</span></label></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="banreason">{L_BAN_REASON}{L_COLON}</label></dt>
|
||||
<dd><input name="banreason" id="banreason" type="text" class="inputbox" maxlength="255" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="bangivereason">{L_BAN_GIVE_REASON}{L_COLON}</label></dt>
|
||||
<dd><input name="bangivereason" id="bangivereason" type="text" class="inputbox" maxlength="255" /></dd>
|
||||
</dl>
|
||||
|
||||
<hr />
|
||||
|
||||
<dl>
|
||||
<dt><label for="banexclude0">{L_BAN_EXCLUDE}{L_COLON}</label><br /><span>{L_BAN_EXCLUDE_EXPLAIN}</span></dt>
|
||||
<dd>
|
||||
<label for="banexclude1"><input type="radio" name="banexclude" id="banexclude1" value="1" /> {L_YES}</label>
|
||||
<label for="banexclude0"><input type="radio" name="banexclude" id="banexclude0" value="0" checked="checked" /> {L_NO}</label>
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- EVENT mcp_ban_fields_after -->
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="bansubmit" value="{L_SUBMIT}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_UNBAN_TITLE}</h3>
|
||||
<p>{L_UNBAN_EXPLAIN}</p>
|
||||
|
||||
<!-- IF S_BANNED_OPTIONS -->
|
||||
<fieldset>
|
||||
<!-- EVENT mcp_ban_unban_before -->
|
||||
<dl>
|
||||
<dt><label for="unban">{L_BAN_CELL}{L_COLON}</label></dt>
|
||||
<dd><select name="unban[]" id="unban" multiple="multiple" size="5" onchange="if (this.selectedIndex != -1) {display_details(this.options[this.selectedIndex].value);}">{BANNED_OPTIONS}</select></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>{L_BAN_LENGTH}{L_COLON}</dt>
|
||||
<dd><strong id="unbanlength"></strong></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>{L_BAN_REASON}{L_COLON}</dt>
|
||||
<dd><strong id="unbanreason"></strong></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt>{L_BAN_GIVE_REASON}{L_COLON}</dt>
|
||||
<dd><strong id="unbangivereason"></strong></dd>
|
||||
</dl>
|
||||
<!-- EVENT mcp_ban_unban_after -->
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="unbansubmit" value="{L_SUBMIT}" class="button1" />
|
||||
</fieldset>
|
||||
|
||||
<!-- ELSE -->
|
||||
|
||||
<p><strong>{L_NO_BAN_CELL}</strong></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ENDIF -->
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
8
public/styles/prosilver/template/mcp_footer.html
Normal file
8
public/styles/prosilver/template/mcp_footer.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
155
public/styles/prosilver/template/mcp_forum.html
Normal file
155
public/styles/prosilver/template/mcp_forum.html
Normal file
|
@ -0,0 +1,155 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<!-- DEFINE $CUSTOM_FIELDSET_CLASS = 'forum-selection2' -->
|
||||
<!-- INCLUDE jumpbox.html -->
|
||||
|
||||
<h2><a href="{U_VIEW_FORUM}">{L_FORUM}{L_COLON} {FORUM_NAME}</a></h2>
|
||||
|
||||
<form method="post" id="mcp" action="{S_MCP_ACTION}">
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="action-bar bar-top">
|
||||
<div class="pagination">
|
||||
{TOTAL_TOPICS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF .topicrow -->
|
||||
<ul class="topiclist<!-- IF S_MERGE_SELECT --> missing-column<!-- ENDIF -->">
|
||||
<li class="header">
|
||||
<dl class="row-item">
|
||||
<dt><div class="list-inner">{L_TOPICS}</div></dt>
|
||||
<dd class="posts">{L_REPLIES}</dd>
|
||||
<dd class="lastpost"><span>{L_LAST_POST}</span></dd>
|
||||
<!-- IF not S_MERGE_SELECT --><dd class="mark">{L_MARK}</dd><!-- ENDIF -->
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist cplist<!-- IF S_MERGE_SELECT --> missing-column<!-- ENDIF -->">
|
||||
|
||||
<!-- BEGIN topicrow -->
|
||||
<li class="row<!-- IF topicrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF --><!-- IF topicrow.S_TOPIC_REPORTED --> reported<!-- ENDIF -->">
|
||||
<dl class="row-item {topicrow.TOPIC_IMG_STYLE}">
|
||||
<dt <!-- IF topicrow.TOPIC_ICON_IMG -->style="background-image: url({T_ICONS_PATH}{topicrow.TOPIC_ICON_IMG}); background-repeat: no-repeat;"<!-- ENDIF -->>
|
||||
<!-- IF topicrow.S_UNREAD_TOPIC --><a href="{topicrow.U_NEWEST_POST}" class="row-item-link"></a><!-- ENDIF -->
|
||||
<div class="list-inner">
|
||||
<!-- EVENT topiclist_row_prepend -->
|
||||
<!-- IF topicrow.S_SELECT_TOPIC --><a href="{topicrow.U_SELECT_TOPIC}" class="topictitle">[ {L_SELECT_MERGE} ]</a> <!-- ENDIF -->
|
||||
<!-- EVENT mcp_forum_topic_title_before -->
|
||||
<a href="{topicrow.U_VIEW_TOPIC}" class="topictitle">{topicrow.TOPIC_TITLE}</a>
|
||||
<!-- EVENT mcp_forum_topic_title_after -->
|
||||
<!-- IF topicrow.S_TOPIC_UNAPPROVED or topicrow.S_POSTS_UNAPPROVED -->
|
||||
<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_UNAPPROVED}">
|
||||
<i class="icon fa-question fa-fw icon-blue" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_UNAPPROVED}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF topicrow.S_TOPIC_DELETED or topicrow.S_POSTS_DELETED -->
|
||||
<a href="{topicrow.U_MCP_QUEUE}" title="{L_TOPIC_DELETED}">
|
||||
<i class="icon fa-recycle fa-fw icon-green" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_DELETED}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF topicrow.S_TOPIC_REPORTED -->
|
||||
<a href="{topicrow.U_MCP_REPORT}" title="{L_TOPIC_REPORTED}">
|
||||
<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{L_TOPIC_REPORTED}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF topicrow.S_MOVED_TOPIC and S_CAN_DELETE --> <a href="{topicrow.U_DELETE_TOPIC}" class="topictitle">[ {L_DELETE_SHADOW_TOPIC} ]</a><!-- ENDIF -->
|
||||
<br />
|
||||
<!-- EVENT topiclist_row_topic_title_after -->
|
||||
<div class="responsive-show" style="display: none;">
|
||||
<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
|
||||
{L_LAST_POST} {L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL} « {topicrow.LAST_POST_TIME}<br />
|
||||
</div>
|
||||
<span class="responsive-show left-box" style="display: none;">{L_REPLIES}{L_COLON} <strong>{topicrow.REPLIES}</strong></span>
|
||||
|
||||
<!-- IF .topicrow.pagination -->
|
||||
<div class="pagination">
|
||||
<ul>
|
||||
<!-- BEGIN pagination -->
|
||||
<!-- IF topicrow.pagination.S_IS_PREV -->
|
||||
<!-- ELSEIF topicrow.pagination.S_IS_CURRENT --><li class="active"><span>{topicrow.pagination.PAGE_NUMBER}</span></li>
|
||||
<!-- ELSEIF topicrow.pagination.S_IS_ELLIPSIS --><li class="ellipsis"><span>{L_ELLIPSIS}</span></li>
|
||||
<!-- ELSEIF topicrow.pagination.S_IS_NEXT -->
|
||||
<!-- ELSE --><li><a href="{topicrow.pagination.PAGE_URL}">{topicrow.pagination.PAGE_NUMBER}</a></li>
|
||||
<!-- ENDIF -->
|
||||
<!-- END pagination -->
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="responsive-hide">
|
||||
<!-- IF topicrow.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF -->
|
||||
{% EVENT topiclist_row_topic_by_author_before %}
|
||||
{L_POST_BY_AUTHOR} {topicrow.TOPIC_AUTHOR_FULL} » {topicrow.FIRST_POST_TIME}
|
||||
{% EVENT topiclist_row_topic_by_author_after %}
|
||||
</div>
|
||||
<!-- EVENT topiclist_row_append -->
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="posts">{topicrow.REPLIES} <dfn>{L_REPLIES}</dfn></dd>
|
||||
<dd class="lastpost"><span><dfn>{L_LAST_POST} </dfn>{L_POST_BY_AUTHOR} {topicrow.LAST_POST_AUTHOR_FULL}<br />{topicrow.LAST_POST_TIME}</span></dd>
|
||||
<!-- IF not S_MERGE_SELECT -->
|
||||
<dd class="mark">
|
||||
<!-- IF not topicrow.S_MOVED_TOPIC --><input type="checkbox" name="topic_id_list[]" value="{topicrow.TOPIC_ID}"<!-- IF topicrow.S_TOPIC_CHECKED --> checked="checked"<!-- ENDIF --> /><!-- ELSE --> <!-- ENDIF -->
|
||||
</dd>
|
||||
<!-- ENDIF -->
|
||||
</dl>
|
||||
</li>
|
||||
<!-- END topicrow -->
|
||||
</ul>
|
||||
<!-- ELSE -->
|
||||
<ul class="topiclist">
|
||||
<li><p class="notopics">{L_NO_TOPICS}</p></li>
|
||||
</ul>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="action-bar bottom">
|
||||
<!-- INCLUDE display_options.html -->
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL_TOPICS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- EVENT mcp_forum_actions_before -->
|
||||
<fieldset class="display-actions">
|
||||
<!-- IF not S_MERGE_SELECT -->
|
||||
<select name="action">
|
||||
<option value="" selected="selected">{L_SELECT_ACTION}</option>
|
||||
<!-- IF S_CAN_DELETE --><option value="delete_topic">{L_DELETE}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_RESTORE --><option value="restore_topic">{L_RESTORE}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MERGE --><option value="merge_topics">{L_MERGE}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MOVE --><option value="move">{L_MOVE}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_FORK --><option value="fork">{L_FORK}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_LOCK --><option value="lock">{L_LOCK}</option><option value="unlock">{L_UNLOCK}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_SYNC --><option value="resync">{L_RESYNC}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MAKE_NORMAL --><option value="make_normal">{L_MAKE_NORMAL}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MAKE_STICKY --><option value="make_sticky">{L_MAKE_STICKY}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MAKE_ANNOUNCE --><option value="make_announce">{L_MAKE_ANNOUNCE}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MAKE_ANNOUNCE_GLOBAL --><option value="make_global">{L_MAKE_GLOBAL}</option><!-- ENDIF -->
|
||||
<!-- EVENT mcp_forum_actions_append -->
|
||||
</select>
|
||||
<input class="button2" type="submit" value="{L_SUBMIT}" />
|
||||
<div><a href="#" onclick="marklist('mcp', 'topic_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'topic_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
<!-- ENDIF -->
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
<!-- EVENT mcp_forum_actions_after -->
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
193
public/styles/prosilver/template/mcp_front.html
Normal file
193
public/styles/prosilver/template/mcp_front.html
Normal file
|
@ -0,0 +1,193 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<h2>{PAGE_TITLE}</h2>
|
||||
|
||||
<!-- EVENT mcp_front_latest_unapproved_before -->
|
||||
|
||||
<!-- IF S_SHOW_UNAPPROVED -->
|
||||
|
||||
<form id="mcp_queue" method="post" action="{S_MCP_QUEUE_ACTION}">
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_LATEST_UNAPPROVED}</h3>
|
||||
<p>{L_UNAPPROVED_TOTAL}</p>
|
||||
|
||||
<!-- IF .unapproved -->
|
||||
<ul class="topiclist missing-column">
|
||||
<li class="header">
|
||||
<dl>
|
||||
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
|
||||
<dd class="moderation"><span>{L_TOPIC} & {L_FORUM}</span></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist cplist missing-column responsive-show-all">
|
||||
|
||||
<!-- BEGIN unapproved -->
|
||||
<li class="row<!-- IF unapproved.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
|
||||
<dl>
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{unapproved.U_POST_DETAILS}" class="topictitle">{unapproved.SUBJECT}</a> <!-- IF unapproved.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF --> <br />
|
||||
{L_POSTED} {L_POST_BY_AUTHOR} {unapproved.AUTHOR_FULL} » {unapproved.POST_TIME}
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="moderation"><span>
|
||||
{L_TOPIC}{L_COLON} <a href="{unapproved.U_TOPIC}">{unapproved.TOPIC_TITLE}</a> [<a href="{unapproved.U_MCP_TOPIC}">{L_MODERATE}</a>]<br />
|
||||
{L_FORUM}{L_COLON} <!-- IF unapproved.U_FORUM --><a href="{unapproved.U_FORUM}">{unapproved.FORUM_NAME}</a><!-- ELSE -->{unapproved.FORUM_NAME}<!-- ENDIF --><!-- IF unapproved.U_MCP_FORUM --> [<a href="{unapproved.U_MCP_FORUM}">{L_MODERATE}</a>]<!-- ENDIF --></span>
|
||||
</dd>
|
||||
|
||||
<dd class="mark"><input type="checkbox" name="post_id_list[]" value="{unapproved.POST_ID}" /></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- END unapproved -->
|
||||
</ul>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
{S_FORM_TOKEN}
|
||||
</div>
|
||||
|
||||
<!-- IF .unapproved -->
|
||||
<fieldset class="display-actions">
|
||||
{S_HIDDEN_FIELDS}
|
||||
<input class="button2" type="submit" name="action[disapprove]" value="{L_DISAPPROVE}" />
|
||||
<input class="button1" type="submit" name="action[approve]" value="{L_APPROVE}" />
|
||||
<div><a href="#" onclick="marklist('mcp_queue', 'post_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp_queue', 'post_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
</form>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_front_latest_reported_before -->
|
||||
|
||||
<!-- IF S_SHOW_REPORTS -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_LATEST_REPORTED}</h3>
|
||||
<p>{L_REPORTS_TOTAL}</p>
|
||||
|
||||
<!-- IF .report -->
|
||||
<ul class="topiclist two-long-columns">
|
||||
<li class="header">
|
||||
<dl>
|
||||
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
|
||||
<dd class="moderation"><span>{L_REPORTER} & {L_FORUM}</span></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist cplist two-long-columns responsive-show-all">
|
||||
|
||||
<!-- BEGIN report -->
|
||||
<li class="row<!-- IF report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
|
||||
<dl>
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{report.U_POST_DETAILS}#reports" class="topictitle">{report.SUBJECT}</a> <!-- IF report.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF --> <br />
|
||||
<span>{L_POSTED} {L_POST_BY_AUTHOR} {report.AUTHOR_FULL} » {report.POST_TIME}</span>
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="moderation">
|
||||
<span>{L_REPORTED} {L_POST_BY_AUTHOR} {report.REPORTER_FULL} {L_REPORTED_ON_DATE} {{ report.REPORT_TIME }}<br />
|
||||
{L_FORUM}{L_COLON} <a href="{report.U_FORUM}">{report.FORUM_NAME}</a></span>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- END report -->
|
||||
</ul>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_front_latest_reported_pms_before -->
|
||||
|
||||
<!-- IF S_SHOW_PM_REPORTS -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_LATEST_REPORTED_PMS}</h3>
|
||||
<p>{L_PM_REPORTS_TOTAL}</p>
|
||||
|
||||
<!-- IF .pm_report -->
|
||||
<ul class="topiclist two-long-columns">
|
||||
<li class="header">
|
||||
<dl>
|
||||
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
|
||||
<dd class="moderation"><span>{L_REPORTER}</span></dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist cplist two-long-columns responsive-show-all">
|
||||
|
||||
<!-- BEGIN pm_report -->
|
||||
<li class="row<!-- IF pm_report.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
|
||||
<dl>
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{pm_report.U_PM_DETAILS}" class="topictitle">{pm_report.PM_SUBJECT}</a> <!-- IF pm_report.ATTACH_ICON_IMG --><i class="icon fa-paperclip fa-fw" aria-hidden="true"></i><!-- ENDIF --> <br />
|
||||
<span>{L_MESSAGE_BY_AUTHOR} {pm_report.PM_AUTHOR_FULL} » {pm_report.PM_TIME}</span><br />
|
||||
<span>{L_MESSAGE_TO} {pm_report.RECIPIENTS}</span>
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="moderation">
|
||||
<span>{L_REPORTED} {L_POST_BY_AUTHOR} {pm_report.REPORTER_FULL} {L_REPORTED_ON_DATE} {pm_report.REPORT_TIME}</span>
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- END pm_report -->
|
||||
</ul>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_front_latest_logs_before -->
|
||||
|
||||
<!-- IF S_SHOW_LOGS -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_LATEST_LOGS}</h3>
|
||||
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_ACTION}</th>
|
||||
<th class="name">{L_USERNAME}</th>
|
||||
<th class="name">{L_IP}</th>
|
||||
<th class="name">{L_VIEW_TOPIC}</th>
|
||||
<th class="name">{L_VIEW_TOPIC_LOGS}</th>
|
||||
<th class="name">{L_TIME}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- BEGIN log -->
|
||||
<tr class="<!-- IF log.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<td>{log.ACTION}</td>
|
||||
<td><span>{log.USERNAME}</span></td>
|
||||
<td><span>{log.IP}</span></td>
|
||||
<td><span><!-- IF log.U_VIEW_TOPIC --><a href="{log.U_VIEW_TOPIC}" title="{L_VIEW_TOPIC}">{L_VIEW_TOPIC}</a><!-- ENDIF --> </span></td>
|
||||
<td><span><!-- IF log.U_VIEWLOGS --><a href="{log.U_VIEWLOGS}">{L_VIEW_TOPIC_LOGS}</a><!-- ENDIF --> </span></td>
|
||||
<td><span>{log.TIME}</span></td>
|
||||
</tr>
|
||||
<!-- BEGINELSE -->
|
||||
<tr>
|
||||
<td colspan="6">{L_NO_ENTRIES}</td>
|
||||
</tr>
|
||||
<!-- END log -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_front_latest_logs_after -->
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
49
public/styles/prosilver/template/mcp_header.html
Normal file
49
public/styles/prosilver/template/mcp_header.html
Normal file
|
@ -0,0 +1,49 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<h2>{L_MCP}</h2>
|
||||
|
||||
<!-- IF U_MCP -->
|
||||
<p class="linkmcp responsive-center">
|
||||
[<!-- IF U_ACP --> <a href="{U_ACP}" title="{L_ACP}" data-responsive-text="{L_ACP_SHORT}">{L_ACP}</a> |<!-- ENDIF --> <a href="{U_MCP}" title="{L_MCP}" data-responsive-text="{L_MCP_SHORT}">{L_MCP}</a><!-- IF U_MCP_FORUM --> | <a href="{U_MCP_FORUM}">{L_MODERATE_FORUM}</a><!-- ENDIF --><!-- IF U_MCP_TOPIC --> | <a href="{U_MCP_TOPIC}">{L_MODERATE_TOPIC}</a><!-- ENDIF --><!-- IF U_MCP_POST --> | <a href="{U_MCP_POST}">{L_MODERATE_POST}</a><!-- ENDIF --> ]
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div id="tabs" class="tabs">
|
||||
<ul>
|
||||
<!-- BEGIN l_block1 -->
|
||||
<li class="tab<!-- IF l_block1.S_SELECTED --> activetab<!-- ENDIF -->"><a href="{l_block1.U_TITLE}">{l_block1.L_TITLE}</a></li>
|
||||
<!-- END l_block1 -->
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="panel bg3">
|
||||
<div class="inner">
|
||||
|
||||
<div style="width: 100%;">
|
||||
|
||||
<div id="cp-menu" class="cp-menu">
|
||||
<div id="navigation" class="navigation" role="navigation">
|
||||
<ul>
|
||||
<!-- BEGIN l_block1 -->
|
||||
<!-- IF l_block1.S_SELECTED -->
|
||||
<!-- BEGIN l_block2 -->
|
||||
<!-- IF l_block1.l_block2.S_SELECTED -->
|
||||
<li id="active-subsection" class="active-subsection"><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
|
||||
<!-- ELSE -->
|
||||
<li><a href="{l_block1.l_block2.U_TITLE}"><span>{l_block1.l_block2.L_TITLE}<!-- IF l_block1.l_block2.ADD_ITEM --> ({l_block1.l_block2.ADD_ITEM})<!-- ENDIF --></span></a></li>
|
||||
<!-- ENDIF -->
|
||||
<!-- END l_block2 -->
|
||||
<!-- ENDIF -->
|
||||
<!-- END l_block1 -->
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="cp-main" class="cp-main mcp-main panel-container">
|
||||
<!-- IF MESSAGE -->
|
||||
<div class="content">
|
||||
<h2 class="message-title">{L_MESSAGE}</h2>
|
||||
<p class="error">{MESSAGE}</p>
|
||||
<p><!-- BEGIN return_links -->{return_links.MESSAGE_LINK}<br /><br /><!-- END return_links --></p>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
88
public/styles/prosilver/template/mcp_logs.html
Normal file
88
public/styles/prosilver/template/mcp_logs.html
Normal file
|
@ -0,0 +1,88 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<h2>{L_TITLE}</h2>
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="action-bar bar-top">
|
||||
{L_SEARCH_KEYWORDS}{L_COLON} <input type="search" class="inputbox autowidth" name="keywords" value="{S_KEYWORDS}" /> <input type="submit" class="button2" name="filter" value="{L_SEARCH}" />
|
||||
<div class="pagination">
|
||||
{TOTAL}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_USERNAME}</th>
|
||||
<th class="center">{L_IP}</th>
|
||||
<th class="center">{L_TIME}</th>
|
||||
<th class="name">{L_ACTION}</th>
|
||||
<!-- IF S_CLEAR_ALLOWED --><th>{L_MARK}</th><!-- ENDIF -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- IF S_LOGS -->
|
||||
<!-- BEGIN log -->
|
||||
<!-- IF log.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF -->
|
||||
<td>{log.USERNAME}</td>
|
||||
<td class="center">{log.IP}</td>
|
||||
<td class="center">{log.DATE}</td>
|
||||
<td>{log.ACTION}<br />
|
||||
{log.DATA}
|
||||
</td>
|
||||
<!-- IF S_CLEAR_ALLOWED --><td style="width: 5%" align="center"><input type="checkbox" name="mark[]" value="{log.ID}" /></td><!-- ENDIF -->
|
||||
</tr>
|
||||
<!-- END log -->
|
||||
<!-- ELSE -->
|
||||
<tr>
|
||||
<td class="bg1" colspan="<!-- IF S_CLEAR_ALLOWED -->5<!-- ELSE -->4<!-- ENDIF -->" align="center"><span class="gen">{L_NO_ENTRIES}</span></td>
|
||||
</tr>
|
||||
<!-- ENDIF -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- IF .log -->
|
||||
<div class="action-bar bottom">
|
||||
<!-- INCLUDE display_options.html -->
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{S_FORM_TOKEN}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_CLEAR_ALLOWED -->
|
||||
<fieldset class="display-actions">
|
||||
<input class="button2" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />
|
||||
<input class="button1" type="submit" value="{L_DELETE_MARKED}" name="action[del_marked]" />
|
||||
|
||||
<div><a href="#" onclick="marklist('mcp', 'mark', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'mark', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
<!-- ELSE -->
|
||||
{S_FORM_TOKEN}
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
</form>
|
||||
|
||||
<br />
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
8
public/styles/prosilver/template/mcp_message.html
Normal file
8
public/styles/prosilver/template/mcp_message.html
Normal file
|
@ -0,0 +1,8 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<div class="content">
|
||||
<h2 class="message-title">{MESSAGE_TITLE}</h2>
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
</div>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
73
public/styles/prosilver/template/mcp_move.html
Normal file
73
public/styles/prosilver/template/mcp_move.html
Normal file
|
@ -0,0 +1,73 @@
|
|||
<!-- IF S_AJAX_REQUEST -->
|
||||
|
||||
<h3>{MESSAGE_TITLE}</h3>
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
|
||||
<!-- IF ADDITIONAL_MSG --><p>{ADDITIONAL_MSG}</p><!-- ENDIF -->
|
||||
|
||||
<label>
|
||||
<strong>{L_SELECT_DESTINATION_FORUM}{L_COLON}</strong>
|
||||
<select name="to_forum_id">{S_FORUM_SELECT}</select>
|
||||
</label>
|
||||
|
||||
<!-- IF S_CAN_LEAVE_SHADOW -->
|
||||
<label for="move_leave_shadow">
|
||||
<input type="checkbox" name="move_leave_shadow" id="move_leave_shadow" />{L_LEAVE_SHADOW}
|
||||
</label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_CAN_LOCK_TOPIC -->
|
||||
<label for="move_lock_topics">
|
||||
<input type="checkbox" name="move_lock_topics" id="move_lock_topics" />{L_LOCK_TOPIC}
|
||||
</label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="button" name="confirm" value="{YES_VALUE}" class="button1" />
|
||||
<input type="button" name="cancel" value="{L_NO}" class="button2" />
|
||||
</fieldset>
|
||||
|
||||
<!-- ELSE -->
|
||||
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<!-- EVENT mcp_move_before -->
|
||||
|
||||
<form id="confirm" action="{S_CONFIRM_ACTION}" method="post">
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<h2 class="message-title">{MESSAGE_TITLE}</h2>
|
||||
<!-- IF ADDITIONAL_MSG --><p>{ADDITIONAL_MSG}</p><!-- ENDIF -->
|
||||
|
||||
<fieldset>
|
||||
{% EVENT mcp_move_destination_forum_before %}
|
||||
<dl class="fields2">
|
||||
<dt><label>{L_SELECT_DESTINATION_FORUM}{L_COLON}</label></dt>
|
||||
<dd><select name="to_forum_id">{S_FORUM_SELECT}</select></dd>
|
||||
<!-- IF S_CAN_LEAVE_SHADOW --><dd><label for="move_leave_shadow"><input type="checkbox" name="move_leave_shadow" id="move_leave_shadow" />{L_LEAVE_SHADOW}</label></dd><!-- ENDIF -->
|
||||
<!-- IF S_CAN_LOCK_TOPIC --><dd><label for="move_lock_topics"><input type="checkbox" name="move_lock_topics" id="move_lock_topics" />{L_LOCK_TOPIC}</label></dd><!-- ENDIF -->
|
||||
</dl>
|
||||
{% EVENT mcp_move_destination_forum_after %}
|
||||
<dl class="fields2">
|
||||
<dt> </dt>
|
||||
<dd><strong>{MESSAGE_TEXT}</strong></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}<input type="submit" name="confirm" value="{YES_VALUE}" class="button1" />
|
||||
<input type="submit" name="cancel" value="{L_NO}" class="button2" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
<!-- ENDIF -->
|
28
public/styles/prosilver/template/mcp_notes_front.html
Normal file
28
public/styles/prosilver/template/mcp_notes_front.html
Normal file
|
@ -0,0 +1,28 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<h2>{L_TITLE}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<fieldset>
|
||||
<dl>
|
||||
<dt><label for="username">{L_SELECT_USER}{L_COLON}</label></dt>
|
||||
<dd><input name="username" id="username" type="text" class="inputbox" /></dd>
|
||||
<dd><strong><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></strong></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
121
public/styles/prosilver/template/mcp_notes_user.html
Normal file
121
public/styles/prosilver/template/mcp_notes_user.html
Normal file
|
@ -0,0 +1,121 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<h2>{L_TITLE}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{USERNAME_FULL}</h3>
|
||||
|
||||
<div>
|
||||
<div class="column1">
|
||||
<!-- IF AVATAR_IMG --><div>{AVATAR_IMG}</div><!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
<div class="column2">
|
||||
<dl class="details">
|
||||
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
|
||||
<!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE --> <!-- ELSE -->{L_RANK}{L_COLON}<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
|
||||
<dt>{L_JOINED}{L_COLON}</dt><dd>{JOINED}</dd>
|
||||
<dt>{L_TOTAL_POSTS}{L_COLON}</dt><dd>{POSTS}</dd>
|
||||
<dt>{L_WARNINGS}{L_COLON} </dt><dd>{WARNINGS}</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_ADD_FEEDBACK}</h3>
|
||||
<p>{L_ADD_FEEDBACK_EXPLAIN}</p>
|
||||
|
||||
<fieldset>
|
||||
<textarea name="usernote" id="usernote" class="inputbox" cols="40" rows="3"></textarea>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_FIELDS}<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="action[add_feedback]" value="{L_SUBMIT}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="action-bar bar-top">
|
||||
{L_SEARCH_KEYWORDS}{L_COLON} <input type="search" class="inputbox autowidth" name="keywords" value="{S_KEYWORDS}" /> <input type="submit" class="button2" name="filter" value="{L_SEARCH}" />
|
||||
<div class="pagination">
|
||||
{TOTAL_REPORTS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name reportby">{L_REPORT_BY}</th>
|
||||
<th class="center">{L_IP}</th>
|
||||
<th class="center">{L_TIME}</th>
|
||||
<th>{L_ACTION_NOTE}</th>
|
||||
<!-- IF S_CLEAR_ALLOWED --><th>{L_MARK}</th><!-- ENDIF -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- BEGIN usernotes -->
|
||||
<!-- IF usernotes.S_ROW_COUNT is even --><tr class="bg1"><!-- ELSE --><tr class="bg2"><!-- ENDIF -->
|
||||
<td>{usernotes.REPORT_BY}</td>
|
||||
<td class="center">{usernotes.IP}</td>
|
||||
<td class="center">{usernotes.REPORT_AT}</td>
|
||||
<td>{usernotes.ACTION}</td>
|
||||
|
||||
<!-- IF S_CLEAR_ALLOWED --><td class="center" style="width: 5%;"><input type="checkbox" name="marknote[]" id="note-{usernotes.ID}" value="{usernotes.ID}" /></td><!-- ENDIF -->
|
||||
</tr>
|
||||
<!-- BEGINELSE -->
|
||||
<tr>
|
||||
<td class="bg1" colspan="<!-- IF S_CLEAR_ALLOWED -->5<!-- ELSE -->4<!-- ENDIF -->" align="center"><span class="gen">{L_NO_ENTRIES}</span></td>
|
||||
</tr>
|
||||
<!-- END usernotes -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="action-bar bottom">
|
||||
<!-- INCLUDE display_options.html -->
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL_REPORTS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_CLEAR_ALLOWED -->
|
||||
<fieldset class="display-actions">
|
||||
<input class="button2" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />
|
||||
<input class="button1" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="display-actions">
|
||||
<div><a href="#" onclick="marklist('mcp', 'marknote', true); return false;">{L_MARK_ALL}</a> • <a href="#" onclick="marklist('mcp', 'marknote', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
364
public/styles/prosilver/template/mcp_post.html
Normal file
364
public/styles/prosilver/template/mcp_post.html
Normal file
|
@ -0,0 +1,364 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<!-- IF S_MCP_REPORT -->
|
||||
<!-- IF S_PM -->
|
||||
<h2>{L_PM_REPORT_DETAILS}</h2>
|
||||
<!-- ELSE -->
|
||||
<h2>{L_REPORT_DETAILS}</h2>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div id="report" class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="postbody">
|
||||
<h3>{L_REPORT_REASON}{L_COLON} {REPORT_REASON_TITLE}</h3>
|
||||
<p class="author">{L_REPORTED} {L_POST_BY_AUTHOR} {REPORTER_FULL} « {REPORT_DATE}</p>
|
||||
<!-- IF S_REPORT_CLOSED -->
|
||||
<p class="post-notice reported"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i>{L_REPORT_CLOSED}</p>
|
||||
<!-- ENDIF -->
|
||||
<div class="content">
|
||||
<!-- IF REPORT_TEXT -->
|
||||
{REPORT_TEXT}
|
||||
<!-- ELSE -->
|
||||
{REPORT_REASON_DESCRIPTION}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form method="post" id="mcp_report" action="{S_CLOSE_ACTION}">
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
{% EVENT mcp_post_report_buttons_top_before %}
|
||||
<!-- IF not S_REPORT_CLOSED -->
|
||||
<input class="button1" type="submit" value="{L_CLOSE_REPORT}" name="action[close]" />
|
||||
<!-- ENDIF -->
|
||||
<input class="button2" type="submit" value="{L_DELETE_REPORT}" name="action[delete]" />
|
||||
{% EVENT mcp_post_report_buttons_top_after %}
|
||||
<input type="hidden" name="report_id_list[]" value="{REPORT_ID}" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<!-- ELSE -->
|
||||
<h2>{L_POST_DETAILS}</h2>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="postbody">
|
||||
<h3><a href="{U_VIEW_POST}">{POST_SUBJECT}</a></h3>
|
||||
|
||||
<ul class="post-buttons">
|
||||
<li id="expand">
|
||||
<a href="#post_details" onclick="viewableArea(getElementById('post_details'), true); var rev_text = getElementById('expand').getElementsByTagName('a').item(0).firstChild; if (rev_text.data.trim() == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data.trim() == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}';} return false;">
|
||||
{L_EXPAND_VIEW}
|
||||
</a>
|
||||
</li>
|
||||
<!-- IF U_EDIT -->
|
||||
<li>
|
||||
<a href="{U_EDIT}" title="{L_EDIT_POST}" class="button">
|
||||
<i class="icon fa-pencil fa-fw" aria-hidden="true"></i><span class="sr-only">{L_EDIT_POST}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
</ul>
|
||||
|
||||
<!-- IF S_PM -->
|
||||
<p class="author">
|
||||
<strong>{L_SENT_AT}{L_COLON}</strong> {POST_DATE}
|
||||
<br /><strong>{L_PM_FROM}{L_COLON}</strong> {POST_AUTHOR_FULL}
|
||||
<!-- IF S_TO_RECIPIENT --><br /><strong>{L_TO}{L_COLON}</strong> <!-- BEGIN to_recipient --><!-- IF to_recipient.NAME_FULL -->{to_recipient.NAME_FULL}<!-- ELSE --><a href="{to_recipient.U_VIEW}"<!-- IF to_recipient.COLOUR --> style="color:{to_recipient.COLOUR};"<!-- ENDIF -->><strong>{to_recipient.NAME}</strong></a><!-- ENDIF --> <!-- END to_recipient --><!-- ENDIF -->
|
||||
<!-- IF S_BCC_RECIPIENT --><br /><strong>{L_BCC}{L_COLON}</strong> <!-- BEGIN bcc_recipient --><!-- IF bcc_recipient.NAME_FULL -->{bcc_recipient.NAME_FULL}<!-- ELSE --><a href="{bcc_recipient.U_VIEW}"<!-- IF bcc_recipient.COLOUR --> style="color:{bcc_recipient.COLOUR};"<!-- ENDIF -->><strong>{bcc_recipient.NAME}</strong></a><!-- ENDIF --> <!-- END bcc_recipient --><!-- ENDIF -->
|
||||
</p>
|
||||
<!-- ELSE -->
|
||||
<p class="author"><span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{MINI_POST_IMG}</span></span> {L_POSTED} {L_POST_BY_AUTHOR} {POST_AUTHOR_FULL} » {POST_DATE}</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_POST_UNAPPROVED -->
|
||||
<form method="post" id="mcp_approve" action="{U_APPROVE_ACTION}">
|
||||
|
||||
<p class="post-notice unapproved">
|
||||
<input class="button2" type="submit" value="{L_DISAPPROVE}" name="action[disapprove]" />
|
||||
<input class="button1" type="submit" value="{L_APPROVE}" name="action[approve]" />
|
||||
<!-- IF not S_FIRST_POST --><input type="hidden" name="mode" value="unapproved_posts" /><!-- ENDIF -->
|
||||
<input type="hidden" name="post_id_list[]" value="{POST_ID}" />
|
||||
{S_FORM_TOKEN}
|
||||
</p>
|
||||
</form>
|
||||
<!-- ELSEIF S_POST_DELETED -->
|
||||
<form method="post" id="mcp_approve" action="{U_APPROVE_ACTION}">
|
||||
|
||||
<p class="post-notice deleted">
|
||||
<!-- IF S_CAN_DELETE_POST --><input class="button2" type="submit" value="{L_DELETE}" name="action[delete]" /> <!-- ENDIF -->
|
||||
<input class="button1" type="submit" value="{L_RESTORE}" name="action[restore]" />
|
||||
<!-- IF not S_FIRST_POST --><input type="hidden" name="mode" value="deleted_posts" /><!-- ENDIF -->
|
||||
<input type="hidden" name="post_id_list[]" value="{POST_ID}" />
|
||||
{S_FORM_TOKEN}
|
||||
</p>
|
||||
</form>
|
||||
<!-- ENDIF -->
|
||||
|
||||
{% if S_POST_REPORTED and not S_MCP_REPORT %}
|
||||
<p class="post-notice reported">
|
||||
<i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><span class="sr-only">{{ lang('TOPIC_REPORTED') }}</span> <a href="{{ U_MCP_REPORT }}"><strong>{{ lang('POST_REPORTED') }}</strong></a>
|
||||
</p>
|
||||
{% endif %}
|
||||
|
||||
{% EVENT mcp_post_text_before %}
|
||||
|
||||
<div id="post_details" class="content post_details">
|
||||
{POST_PREVIEW}
|
||||
</div>
|
||||
|
||||
{% EVENT mcp_post_text_after %}
|
||||
|
||||
<!-- IF S_HAS_ATTACHMENTS -->
|
||||
<dl class="attachbox">
|
||||
<dt>{L_ATTACHMENTS}</dt>
|
||||
<!-- BEGIN attachment -->
|
||||
<dd>{attachment.DISPLAY_ATTACHMENT}</dd>
|
||||
<!-- END attachment -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF DELETED_MESSAGE or DELETE_REASON -->
|
||||
<div class="notice">
|
||||
{DELETED_MESSAGE}
|
||||
<!-- IF DELETE_REASON --><br /><strong>{L_REASON}{L_COLON}</strong> <em>{DELETE_REASON}</em><!-- ENDIF -->
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF SIGNATURE -->
|
||||
<div id="sig{POST_ID}" class="signature">{SIGNATURE}</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_MCP_REPORT and S_CAN_VIEWIP -->
|
||||
<hr />
|
||||
<div><!-- IF S_PM -->{L_THIS_PM_IP}<!-- ELSE -->{L_THIS_POST_IP}<!-- ENDIF -->{L_COLON} <!-- IF U_WHOIS -->
|
||||
<a href="{U_WHOIS}"><!-- IF POST_IPADDR -->{POST_IPADDR}<!-- ELSE -->{POST_IP}<!-- ENDIF --></a> (<!-- IF POST_IPADDR -->{POST_IP}<!-- ELSE --><a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a><!-- ENDIF -->)
|
||||
<!-- ELSE -->
|
||||
<!-- IF POST_IPADDR -->{POST_IPADDR} ({POST_IP})<!-- ELSE -->{POST_IP}<!-- IF U_LOOKUP_IP --> (<a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a>)<!-- ENDIF --><!-- ENDIF -->
|
||||
<!-- ENDIF --></div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_CAN_LOCK_POST or S_CAN_DELETE_POST or S_CAN_CHGPOSTER or S_MCP_POST_ADDITIONAL_OPTS -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_MOD_OPTIONS}</h3>
|
||||
<!-- IF S_CAN_CHGPOSTER -->
|
||||
<form method="post" id="mcp_chgposter" action="{U_POST_ACTION}">
|
||||
|
||||
<fieldset>
|
||||
<dl>
|
||||
<dt><label>{L_CHANGE_POSTER}{L_COLON}</label></dt>
|
||||
<!-- IF S_USER_SELECT --><dd><select name="u">{S_USER_SELECT}</select> <input type="submit" class="button2" name="action[chgposter_ip]" value="{L_CONFIRM}" /></dd><!-- ENDIF -->
|
||||
<dd style="margin-top:3px;">
|
||||
<input class="inputbox autowidth" type="text" name="username" value="" />
|
||||
<input type="submit" class="button2" name="action[chgposter]" value="{L_CONFIRM}" />
|
||||
<br />
|
||||
<span>[ <a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a> ]</span>
|
||||
</dd>
|
||||
</dl>
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_post_additional_options -->
|
||||
|
||||
<!-- IF S_CAN_LOCK_POST or S_CAN_DELETE_POST -->
|
||||
<form method="post" id="mcp" action="{U_MCP_ACTION}">
|
||||
|
||||
<fieldset>
|
||||
<dl>
|
||||
<dt><label>{L_MOD_OPTIONS}{L_COLON}</label></dt>
|
||||
<dd><select name="action">
|
||||
<!-- IF S_CAN_LOCK_POST --><!-- IF S_POST_LOCKED --><option value="unlock_post">{L_UNLOCK_POST} [{L_UNLOCK_POST_EXPLAIN}]</option><!-- ELSE --><option value="lock_post">{L_LOCK_POST} [{L_LOCK_POST_EXPLAIN}]</option><!-- ENDIF --><!-- ENDIF -->
|
||||
<!-- IF S_CAN_DELETE_POST --><option value="delete_post">{L_DELETE_POST}</option><!-- ENDIF -->
|
||||
</select> <input class="button2" type="submit" value="{L_SUBMIT}" />
|
||||
</dd>
|
||||
</dl>
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
|
||||
<!-- IF S_MCP_QUEUE or S_MCP_REPORT or RETURN_TOPIC -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<p><!-- IF S_MCP_QUEUE -->{RETURN_QUEUE} | {RETURN_TOPIC_SIMPLE} | {RETURN_POST}<!-- ELSEIF S_MCP_REPORT -->{RETURN_REPORTS}<!-- IF not S_PM --> | <a href="{U_VIEW_POST}">{L_VIEW_POST}</a> | <a href="{U_VIEW_TOPIC}">{L_VIEW_TOPIC}</a> | <a href="{U_VIEW_FORUM}">{L_VIEW_FORUM}</a><!-- ENDIF --><!-- ELSE -->{RETURN_TOPIC}<!-- ENDIF --></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_MCP_QUEUE -->
|
||||
<!-- ELSE -->
|
||||
|
||||
<!-- IF S_SHOW_USER_NOTES -->
|
||||
<div class="panel" id="usernotes">
|
||||
<div class="inner">
|
||||
|
||||
<form method="post" id="mcp_notes" action="{U_POST_ACTION}">
|
||||
|
||||
<!-- IF S_USER_NOTES -->
|
||||
<h3>{L_FEEDBACK}</h3>
|
||||
|
||||
<!-- BEGIN usernotes -->
|
||||
<span class="small"><strong>{L_REPORTED_BY}{L_COLON} {usernotes.REPORT_BY} « {usernotes.REPORT_AT}</strong></span>
|
||||
<!-- IF S_CLEAR_ALLOWED --><div class="right-box"><input type="checkbox" name="marknote[]" value="{usernotes.ID}" /></div><!-- ENDIF -->
|
||||
<div class="postbody">{usernotes.ACTION}</div>
|
||||
|
||||
<hr class="dashed" />
|
||||
<!-- END usernotes -->
|
||||
|
||||
<!-- IF S_CLEAR_ALLOWED -->
|
||||
<fieldset class="submit-buttons">
|
||||
<input class="button2" type="submit" name="action[del_all]" value="{L_DELETE_ALL}" />
|
||||
<input class="button2" type="submit" name="action[del_marked]" value="{L_DELETE_MARKED}" />
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<h3>{L_ADD_FEEDBACK}</h3>
|
||||
<p>{L_ADD_FEEDBACK_EXPLAIN}</p>
|
||||
|
||||
<fieldset>
|
||||
<textarea name="usernote" rows="4" cols="76" class="inputbox"></textarea>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input class="button1" type="submit" name="action[add_feedback]" value="{L_SUBMIT}" />
|
||||
<input class="button2" type="reset" value="{L_RESET}" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_SHOW_REPORTS -->
|
||||
<div class="panel" id="reports">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_MCP_POST_REPORTS}</h3>
|
||||
|
||||
<!-- BEGIN reports -->
|
||||
<span class="small"><strong>{L_REPORTED_BY}{L_COLON} <!-- IF reports.U_REPORTER --><a href="{reports.U_REPORTER}">{reports.REPORTER}</a><!-- ELSE -->{reports.REPORTER}<!-- ENDIF --> « {reports.REPORT_TIME}</strong></span>
|
||||
<p><em>{reports.REASON_TITLE}{L_COLON} {reports.REASON_DESC}</em><!-- IF reports.REPORT_TEXT --><br />{reports.REPORT_TEXT}<!-- ENDIF --></p>
|
||||
<!-- END reports -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_CAN_VIEWIP and not S_MCP_REPORT -->
|
||||
<div class="panel" id="ip">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_THIS_POST_IP}{L_COLON} <!-- IF U_WHOIS -->
|
||||
<a href="{U_WHOIS}"><!-- IF POST_IPADDR -->{POST_IPADDR}<!-- ELSE -->{POST_IP}<!-- ENDIF --></a> (<!-- IF POST_IPADDR -->{POST_IP}<!-- ELSE --><a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a><!-- ENDIF -->)
|
||||
<!-- ELSE -->
|
||||
<!-- IF POST_IPADDR -->{POST_IPADDR} ({POST_IP})<!-- ELSE -->{POST_IP}<!-- IF U_LOOKUP_IP --> (<a href="{U_LOOKUP_IP}">{L_LOOKUP_IP}</a>)<!-- ENDIF --><!-- ENDIF -->
|
||||
<!-- ENDIF --></p>
|
||||
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_OTHER_USERS}</th>
|
||||
<th class="posts">{L_POSTS}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- BEGIN userrow -->
|
||||
<tr class="<!-- IF userrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<td><!-- IF userrow.U_PROFILE --><a href="{userrow.U_PROFILE}">{userrow.USERNAME}</a><!-- ELSE -->{userrow.USERNAME}<!-- ENDIF --></td>
|
||||
<td class="posts"><a href="{userrow.U_SEARCHPOSTS}" title="{L_SEARCH_POSTS_BY} {userrow.USERNAME}">{userrow.NUM_POSTS}</a></td>
|
||||
</tr>
|
||||
<!-- BEGINELSE -->
|
||||
<tr>
|
||||
<td colspan="2">{L_NO_MATCHES_FOUND}</td>
|
||||
</tr>
|
||||
<!-- END userrow -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="pagination">
|
||||
<!-- INCLUDE pagination.html -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_IPS_POSTED_FROM}</th>
|
||||
<th class="posts">{L_POSTS}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- BEGIN iprow -->
|
||||
<tr class="<!-- IF iprow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<td><!-- IF iprow.HOSTNAME --><a href="{iprow.U_WHOIS}">{iprow.HOSTNAME}</a> ({iprow.IP})<!-- ELSE --><a href="{iprow.U_WHOIS}">{iprow.IP}</a> (<a href="{iprow.U_LOOKUP_IP}">{L_LOOKUP_IP}</a>)<!-- ENDIF --></td>
|
||||
<td class="posts">{iprow.NUM_POSTS}</td>
|
||||
</tr>
|
||||
<!-- BEGINELSE -->
|
||||
<tr>
|
||||
<td colspan="2">{L_NO_MATCHES_FOUND}</td>
|
||||
</tr>
|
||||
<!-- END iprow -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% if U_LOOKUP_ALL %}
|
||||
<div class="buttons">
|
||||
<p><a href="{U_LOOKUP_ALL}#ip">{L_LOOKUP_ALL}</a></p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="pagination">
|
||||
<ul>
|
||||
<!-- BEGIN pagination_ips -->
|
||||
<!-- IF pagination_ips.S_IS_PREV -->
|
||||
<li class="arrow previous"><a class="button button-icon-only" href="{pagination_ips.PAGE_URL}" rel="prev" role="button"><i class="icon fa-chevron-{S_CONTENT_FLOW_BEGIN} fa-fw" aria-hidden="true"></i><span class="sr-only">{L_PREVIOUS}</span></a></li>
|
||||
<!-- ELSEIF pagination_ips.S_IS_CURRENT -->
|
||||
<li class="active"><span>{pagination_ips.PAGE_NUMBER}</span></li>
|
||||
<!-- ELSEIF pagination_ips.S_IS_ELLIPSIS -->
|
||||
<li class="ellipsis" role="separator"><span>{L_ELLIPSIS}</span></li>
|
||||
<!-- ELSEIF pagination_ips.S_IS_NEXT -->
|
||||
<li class="arrow next"><a class="button button-icon-only" href="{pagination_ips.PAGE_URL}" rel="next" role="button"><i class="icon fa-chevron-{S_CONTENT_FLOW_END} fa-fw" aria-hidden="true"></i><span class="sr-only">{L_NEXT}</span></a></li>
|
||||
<!-- ELSE -->
|
||||
<li><a class="button" href="{pagination_ips.PAGE_URL}" role="button">{pagination_ips.PAGE_NUMBER}</a></li>
|
||||
<!-- ENDIF -->
|
||||
<!-- END pagination_ips -->
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_TOPIC_REVIEW --><!-- INCLUDE posting_topic_review.html --><!-- ENDIF -->
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
123
public/styles/prosilver/template/mcp_queue.html
Normal file
123
public/styles/prosilver/template/mcp_queue.html
Normal file
|
@ -0,0 +1,123 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form id="mcp" method="post" action="{S_MCP_ACTION}">
|
||||
|
||||
<fieldset class="forum-selection">
|
||||
<label for="fo">{L_FORUM}{L_COLON} <select name="f" id="fo">{S_FORUM_OPTIONS}</select></label>
|
||||
<input type="submit" name="sort" value="{L_GO}" class="button2" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
<h2>{L_TITLE}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_EXPLAIN}</p>
|
||||
|
||||
<!-- IF .postrow -->
|
||||
<div class="action-bar bar-top">
|
||||
<div class="pagination">
|
||||
{TOTAL}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul class="topiclist missing-column">
|
||||
<li class="header">
|
||||
<dl>
|
||||
<dt><div class="list-inner"><!-- IF S_TOPICS -->{L_TOPIC}<!-- ELSE -->{L_POST}<!-- ENDIF --></div></dt>
|
||||
<dd class="moderation"><span><!-- IF not S_TOPICS -->{L_TOPIC} & <!-- ENDIF -->{L_FORUM}</span></dd>
|
||||
<dd class="mark">{L_MARK}</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist cplist missing-column responsive-show-all">
|
||||
|
||||
<!-- BEGIN postrow -->
|
||||
|
||||
<!-- IF postrow.S_DELETED_TOPIC -->
|
||||
<li><p class="notopics">{L_DELETED_TOPIC}</p></li>
|
||||
<!-- ELSE -->
|
||||
|
||||
<li class="row<!-- IF postrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
|
||||
<dl>
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{postrow.U_VIEW_DETAILS}" class="topictitle">{postrow.POST_SUBJECT}</a><!-- IF postrow.S_HAS_ATTACHMENTS --> <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i> <!-- ENDIF --><br />
|
||||
<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} » {postrow.POST_TIME}</span>
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="moderation">
|
||||
<span>
|
||||
<!-- IF S_TOPICS --><br /><!-- ELSE -->{L_TOPIC}{L_COLON} <a href="{postrow.U_TOPIC}">{postrow.TOPIC_TITLE}</a> <br /><!-- ENDIF -->
|
||||
{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a>
|
||||
</span>
|
||||
</dd>
|
||||
|
||||
|
||||
<dd class="mark">
|
||||
<!-- IF S_TOPICS -->
|
||||
<input type="checkbox" name="topic_id_list[]" value="{postrow.TOPIC_ID}" />
|
||||
<!-- ELSE -->
|
||||
<input type="checkbox" name="post_id_list[]" value="{postrow.POST_ID}" />
|
||||
<!-- ENDIF -->
|
||||
</dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- END postrow -->
|
||||
</ul>
|
||||
|
||||
<div class="action-bar bottom">
|
||||
<!-- INCLUDE display_options.html -->
|
||||
<!-- IF TOPIC_ID --><label><input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" onClick="document.getElementById('mcp').submit()" /> <strong>{L_ONLY_TOPIC}</strong></label><!-- ENDIF -->
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ELSE -->
|
||||
<p class="notopics"><strong>
|
||||
<!-- IF S_RESTORE -->
|
||||
<!-- IF S_TOPICS -->{L_NO_TOPICS_DELETED}<!-- ELSE -->{L_NO_POSTS_DELETED}<!-- ENDIF -->
|
||||
<!-- ELSE -->
|
||||
<!-- IF S_TOPICS -->{L_NO_TOPICS_QUEUE}<!-- ELSE -->{L_NO_POSTS_QUEUE}<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
</strong></p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF .postrow -->
|
||||
<fieldset class="display-actions">
|
||||
<!-- IF S_RESTORE -->
|
||||
<input class="button2" type="submit" name="action[delete]" value="{L_DELETE}" />
|
||||
<input class="button1" type="submit" name="action[restore]" value="{L_RESTORE}" />
|
||||
<!-- ELSE -->
|
||||
<input class="button2" type="submit" name="action[disapprove]" value="{L_DISAPPROVE}" />
|
||||
<input class="button1" type="submit" name="action[approve]" value="{L_APPROVE}" />
|
||||
<!-- ENDIF -->
|
||||
<div>
|
||||
<!-- IF S_TOPICS -->
|
||||
<a href="#" onclick="marklist('mcp', 'topic_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'topic_id_list', false); return false;">{L_UNMARK_ALL}</a>
|
||||
<!-- ELSE -->
|
||||
<a href="#" onclick="marklist('mcp', 'post_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'post_id_list', false); return false;">{L_UNMARK_ALL}</a>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
122
public/styles/prosilver/template/mcp_reports.html
Normal file
122
public/styles/prosilver/template/mcp_reports.html
Normal file
|
@ -0,0 +1,122 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form id="mcp" method="post" action="{S_MCP_ACTION}">
|
||||
|
||||
<!-- IF not S_PM -->
|
||||
<fieldset class="forum-selection">
|
||||
<label for="fo">{L_FORUM}{L_COLON} <select name="f" id="fo">{S_FORUM_OPTIONS}</select></label>
|
||||
<input type="submit" name="sort" value="{L_GO}" class="button2" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<h2>{L_TITLE}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_EXPLAIN}</p>
|
||||
|
||||
<!-- IF .postrow -->
|
||||
<div class="action-bar bar-top">
|
||||
<div class="pagination">
|
||||
{TOTAL_REPORTS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ul class="topiclist missing-column">
|
||||
<li class="header">
|
||||
<dl>
|
||||
<dt><div class="list-inner">{L_VIEW_DETAILS}</div></dt>
|
||||
<dd class="moderation"><span>{L_REPORTER}<!-- IF not S_PM --> & {L_FORUM}<!-- ENDIF --></span></dd>
|
||||
<dd class="mark">{L_MARK}</dd>
|
||||
</dl>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="topiclist cplist missing-column">
|
||||
|
||||
<!-- BEGIN postrow -->
|
||||
<li class="row<!-- IF postrow.S_ROW_COUNT is odd --> bg1<!-- ELSE --> bg2<!-- ENDIF -->">
|
||||
<dl>
|
||||
<!-- IF S_PM -->
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{{ postrow.U_VIEW_DETAILS }}" class="topictitle">{{ postrow.PM_SUBJECT }}</a>
|
||||
{% if postrow.ATTACH_ICON_IMG %} <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i>{% endif %}
|
||||
<br>
|
||||
<span>{L_MESSAGE_BY_AUTHOR} {postrow.PM_AUTHOR_FULL} » {postrow.PM_TIME}</span><br />
|
||||
<span>{L_MESSAGE_TO} {postrow.RECIPIENTS}</span>
|
||||
<div class="responsive-show" style="display: none;">
|
||||
{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} « {postrow.REPORT_TIME}
|
||||
</div>
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="moderation">
|
||||
<span>{postrow.REPORTER_FULL} « {postrow.REPORT_TIME}</span>
|
||||
</dd>
|
||||
<!-- ELSE -->
|
||||
<dt>
|
||||
<div class="list-inner">
|
||||
<a href="{{ postrow.U_VIEW_DETAILS }}" class="topictitle">{{ postrow.POST_SUBJECT }}</a>
|
||||
{% if postrow.ATTACH_ICON_IMG %} <i class="icon fa-paperclip fa-fw" aria-hidden="true"></i>{% endif %}
|
||||
<br>
|
||||
<span>{L_POSTED} {L_POST_BY_AUTHOR} {postrow.POST_AUTHOR_FULL} » {postrow.POST_TIME}</span>
|
||||
<div class="responsive-show" style="display: none;">
|
||||
{L_REPORTER}{L_COLON} {postrow.REPORTER_FULL} « {postrow.REPORT_TIME}<br />
|
||||
<!-- IF postrow.U_VIEWFORUM -->{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a><!-- ELSE -->{postrow.FORUM_NAME}<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
</dt>
|
||||
<dd class="moderation">
|
||||
<span>{postrow.REPORTER_FULL} « {postrow.REPORT_TIME}<br />
|
||||
<!-- IF postrow.U_VIEWFORUM -->{L_FORUM}{L_COLON} <a href="{postrow.U_VIEWFORUM}">{postrow.FORUM_NAME}</a><!-- ELSE -->{postrow.FORUM_NAME}<!-- ENDIF --></span>
|
||||
</dd>
|
||||
<!-- ENDIF -->
|
||||
<dd class="mark"><input type="checkbox" name="report_id_list[]" value="{postrow.REPORT_ID}" /></dd>
|
||||
</dl>
|
||||
</li>
|
||||
<!-- END postrow -->
|
||||
</ul>
|
||||
|
||||
<div class="action-bar bottom">
|
||||
<!-- INCLUDE display_options.html -->
|
||||
<!-- IF TOPIC_ID -->
|
||||
<label>
|
||||
<input type="hidden" name="t" value="0">
|
||||
<input type="checkbox" class="radio" name="t" value="{TOPIC_ID}" checked="checked" onClick="document.getElementById('mcp').submit()" />
|
||||
<strong>{L_ONLY_TOPIC}</strong>
|
||||
</label>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL_REPORTS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ELSE -->
|
||||
<p><strong>{L_NO_REPORTS}</strong></p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF .postrow -->
|
||||
<fieldset class="display-actions">
|
||||
<input class="button2" type="submit" value="{L_DELETE_REPORTS}" name="action[delete]" />
|
||||
<!-- IF not S_CLOSED --> <input class="button1" type="submit" name="action[close]" value="{L_CLOSE_REPORTS}" /><!-- ENDIF -->
|
||||
<div><a href="#" onclick="marklist('mcp', 'report_id_list', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'report_id_list', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
204
public/styles/prosilver/template/mcp_topic.html
Normal file
204
public/styles/prosilver/template/mcp_topic.html
Normal file
|
@ -0,0 +1,204 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<div class="tabs-container">
|
||||
<h2><a href="{U_VIEW_TOPIC}">{L_TOPIC}{L_COLON} {TOPIC_TITLE}</a></h2>
|
||||
|
||||
<!-- IF S_MERGE_VIEW -->
|
||||
<!-- DEFINE $SHOW_PANEL = 'merge-panel' -->
|
||||
<!-- ELSEIF S_SPLIT_VIEW -->
|
||||
<!-- DEFINE $SHOW_PANEL = 'split-panel' -->
|
||||
<!-- ELSE -->
|
||||
<!-- DEFINE $SHOW_PANEL = 'display-panel' -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div id="minitabs" class="minitabs sub-panels" data-show-panel="{$SHOW_PANEL}" role="tablist">
|
||||
<ul>
|
||||
<li id="display-panel-tab" class="tab<!-- IF not S_MERGE_VIEW --> activetab<!-- ENDIF -->">
|
||||
<a href="#minitabs" data-subpanel="display-panel" role="tab" aria-controls="display-panel">{L_DISPLAY_OPTIONS}</a>
|
||||
</li>
|
||||
<li id="split-panel-tab" class="tab">
|
||||
<a href="#minitabs" data-subpanel="split-panel" role="tab" aria-controls="split-panel">{L_SPLIT_TOPIC}</a>
|
||||
</li>
|
||||
<li id="merge-panel-tab" class="tab<!-- IF S_MERGE_VIEW --> activetab<!-- ENDIF -->">
|
||||
<a href="#minitabs" data-subpanel="merge-panel" role="tab" aria-controls="merge-panel">{L_MERGE_POSTS}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form id="mcp" method="post" action="{S_MCP_ACTION}">
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<fieldset id="display-panel" class="fields2" role="tabpanel">
|
||||
<dl>
|
||||
<dt><label for="posts_per_page">{L_POSTS_PER_PAGE}{L_COLON}</label><br /><span>{L_POSTS_PER_PAGE_EXPLAIN}</span></dt>
|
||||
<dd><input class="inputbox autowidth" type="number" min="0" max="999999" name="posts_per_page" id="posts_per_page" value="{POSTS_PER_PAGE}" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label>{L_DISPLAY_POSTS}{L_COLON}</label></dt>
|
||||
<dd>{S_SELECT_SORT_DAYS} <label>{L_SORT_BY} {S_SELECT_SORT_KEY}</label><label>{S_SELECT_SORT_DIR}</label> <input type="submit" name="sort" value="{L_GO}" class="button2" /></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
<!-- IF S_CAN_SPLIT -->
|
||||
<fieldset id="split-panel" class="fields2" role="tabpanel">
|
||||
<p>{L_SPLIT_TOPIC_EXPLAIN}</p>
|
||||
|
||||
<!-- IF S_SHOW_TOPIC_ICONS -->
|
||||
<dl>
|
||||
<dt><label for="icon">{L_TOPIC_ICON}{L_COLON}</label></dt>
|
||||
<dd><label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" /> {L_NO_TOPIC_ICON}</label>
|
||||
<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="" title="" /></label> <!-- END topic_icon --></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_topic_options_before -->
|
||||
<dl>
|
||||
<dt><label for="subject">{L_SPLIT_SUBJECT}{L_COLON}</label></dt>
|
||||
<dd><input type="text" name="subject" id="subject" size="45" maxlength="124" tabindex="2" value="{SPLIT_SUBJECT}" title="{L_SPLIT_SUBJECT}" class="inputbox" /></dd>
|
||||
</dl>
|
||||
<!-- EVENT mcp_topic_options_after -->
|
||||
<dl>
|
||||
<dt><label>{L_SPLIT_FORUM}{L_COLON}</label></dt>
|
||||
<dd><select name="to_forum_id">{S_FORUM_SELECT}</select></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_CAN_MERGE -->
|
||||
<fieldset id="merge-panel" class="fields2" role="tabpanel">
|
||||
<p>{L_MERGE_TOPIC_EXPLAIN}</p>
|
||||
<dl>
|
||||
<dt><label for="to_topic_id">{L_MERGE_TOPIC_ID}{L_COLON}</label></dt>
|
||||
<dd>
|
||||
<input class="inputbox autowidth" type="number" min="0" max="9999999999" name="to_topic_id" id="to_topic_id" value="{TO_TOPIC_ID}" />
|
||||
<a href="{U_SELECT_TOPIC}" >{L_SELECT_TOPIC}</a>
|
||||
</dd>
|
||||
<!-- IF TO_TOPIC_INFO --><dd>{TO_TOPIC_INFO}</dd><!-- ENDIF -->
|
||||
</dl>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3 id="review" class="review">
|
||||
<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
|
||||
{L_TOPIC_REVIEW}{L_COLON} <!-- EVENT mcp_topic_topic_title_before -->{TOPIC_TITLE}<!-- EVENT mcp_topic_topic_title_after -->
|
||||
</h3>
|
||||
|
||||
<div id="topicreview" class="topicreview">
|
||||
<!-- BEGIN postrow -->
|
||||
<!-- EVENT mcp_topic_postrow_post_before -->
|
||||
<div class="post <!-- IF postrow.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
|
||||
<div class="postbody" id="pr{postrow.POST_ID}">
|
||||
<ul class="post-buttons">
|
||||
<li>
|
||||
<a href="{postrow.U_POST_DETAILS}" title="{L_POST_DETAILS}" class="button button-icon-only">
|
||||
<i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_DETAILS}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<label for="post_id_list_select_{postrow.POST_ID}">{L_SELECT}{L_COLON}
|
||||
<input type="checkbox" id="post_id_list_select_{postrow.POST_ID}" name="post_id_list[]" value="{postrow.POST_ID}"<!-- IF postrow.S_CHECKED --> checked="checked"<!-- ENDIF --> />
|
||||
</label>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<!-- EVENT mcp_topic_postrow_post_subject_before -->
|
||||
<h3><a href="{postrow.U_POST_DETAILS}">{postrow.POST_SUBJECT}</a></h3>
|
||||
<!-- EVENT mcp_topic_postrow_post_subject_after -->
|
||||
|
||||
<!-- EVENT mcp_topic_postrow_post_details_before -->
|
||||
<p class="author">
|
||||
<a href="{postrow.U_MINI_POST}" title="{postrow.MINI_POST}">
|
||||
<i class="icon fa-file fa-fw icon-lightgray icon-tiny" aria-hidden="true"></i><span class="sr-only">{postrow.MINI_POST}</span>
|
||||
</a> {L_POSTED} {postrow.POST_DATE} {L_POST_BY_AUTHOR} {% EVENT mcp_topic_post_author_full_prepend %}<strong>{postrow.POST_AUTHOR_FULL}</strong>{% EVENT mcp_topic_post_author_full_append %}<!-- IF postrow.U_MCP_DETAILS --> [ <a href="{postrow.U_MCP_DETAILS}">{L_POST_DETAILS}</a> ]<!-- ENDIF -->
|
||||
</p>
|
||||
<!-- EVENT mcp_topic_postrow_post_details_after -->
|
||||
|
||||
<!-- IF postrow.S_POST_UNAPPROVED -->
|
||||
<p class="post-notice unapproved">
|
||||
<a href="{postrow.U_MCP_APPROVE}"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><strong>{L_POST_UNAPPROVED}</strong></a>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF postrow.S_POST_DELETED -->
|
||||
<p class="post-notice deleted">
|
||||
<a href="{postrow.U_MCP_APPROVE}"><strong>{L_POST_DELETED}</strong></a>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF postrow.S_POST_REPORTED -->
|
||||
<p class="post-notice reported">
|
||||
<a href="{postrow.U_MCP_REPORT}"><i class="icon fa-exclamation fa-fw icon-red" aria-hidden="true"></i><strong>{L_POST_REPORTED}</strong></a>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="content" id="message_{postrow.POST_ID}">{postrow.MESSAGE}</div>
|
||||
|
||||
<!-- EVENT mcp_topic_postrow_attachments_before -->
|
||||
|
||||
<!-- IF postrow.S_HAS_ATTACHMENTS -->
|
||||
<dl class="attachbox">
|
||||
<dt>{L_ATTACHMENTS}</dt>
|
||||
<!-- BEGIN attachment -->
|
||||
<dd>{postrow.attachment.DISPLAY_ATTACHMENT}</dd>
|
||||
<!-- END attachment -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT mcp_topic_postrow_attachments_after -->
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- BEGINELSE -->
|
||||
<p><strong>{{ lang('NO_POSTS_TIME_FRAME') }}</strong></p>
|
||||
<!-- END postrow -->
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<div class="action-bar bar-bottom">
|
||||
<div class="pagination">
|
||||
{TOTAL_POSTS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="display-actions">
|
||||
<select name="action">
|
||||
<option value="" selected="selected">{L_SELECT_ACTION}</option>
|
||||
<!-- IF S_CAN_APPROVE --><option value="approve">{L_APPROVE_POSTS}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_LOCK --><option value="lock_post">{L_LOCK_POST_POSTS} [ {L_LOCK_POST_EXPLAIN} ]</option><option value="unlock_post">{L_UNLOCK_POST_POSTS}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_DELETE --><option value="delete_post">{L_DELETE_POSTS}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_RESTORE --><option value="restore">{L_RESTORE_POSTS}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_MERGE --><option value="merge_posts"<!-- IF S_MERGE_VIEW --> selected="selected"<!-- ENDIF -->>{L_MERGE_POSTS}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_SPLIT --><option value="split_all"<!-- IF S_SPLIT_VIEW --> selected="selected"<!-- ENDIF -->>{L_SPLIT_POSTS}</option><option value="split_beyond">{L_SPLIT_AFTER}</option><!-- ENDIF -->
|
||||
<!-- IF S_CAN_SYNC --><option value="resync">{L_RESYNC}</option><!-- ENDIF -->
|
||||
</select>
|
||||
<input class="button1" type="submit" name="mcp_topic_submit" value="{L_SUBMIT}" />
|
||||
<div><a href="#" onclick="marklist('mcp', 'post', true); return false;">{L_MARK_ALL}</a> :: <a href="#" onclick="marklist('mcp', 'post', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
{S_HIDDEN_FIELDS}
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
97
public/styles/prosilver/template/mcp_warn_front.html
Normal file
97
public/styles/prosilver/template/mcp_warn_front.html
Normal file
|
@ -0,0 +1,97 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<h2>{L_WARN_USER}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_SELECT_USER}</h3>
|
||||
|
||||
<fieldset>
|
||||
<dl>
|
||||
<dt><label for="username">{L_SELECT_USER}{L_COLON}</label></dt>
|
||||
<dd><input name="username" id="username" type="text" class="inputbox" /></dd>
|
||||
<dd><strong><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></strong></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="submituser" value="{L_SUBMIT}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_MOST_WARNINGS}</h3>
|
||||
|
||||
<!-- IF .highest -->
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_USERNAME}</th>
|
||||
<th class="name">{L_WARNINGS}</th>
|
||||
<th class="name">{L_LATEST_WARNING_TIME}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<!-- BEGIN highest -->
|
||||
<tr class="<!-- IF highest.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<td>{highest.USERNAME_FULL}</td>
|
||||
<td>{highest.WARNINGS}</td>
|
||||
<td>{highest.WARNING_TIME}</td>
|
||||
<td><a href="{highest.U_NOTES}">{L_VIEW_NOTES}</a></td>
|
||||
</tr>
|
||||
<!-- END highest -->
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- ELSE -->
|
||||
<p><strong>{L_NO_WARNINGS}</strong></p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_LATEST_WARNINGS}</h3>
|
||||
|
||||
<!-- IF .latest -->
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_USERNAME}</th>
|
||||
<th class="name">{L_TIME}</th>
|
||||
<th class="name">{L_TOTAL_WARNINGS}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- BEGIN latest -->
|
||||
<tr class="<!-- IF latest.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<td>{latest.USERNAME_FULL}</td>
|
||||
<td>{latest.WARNING_TIME}</td>
|
||||
<td>{latest.WARNINGS}</td>
|
||||
<td><a href="{latest.U_NOTES}">{L_VIEW_NOTES}</a></td>
|
||||
</tr>
|
||||
<!-- END latest -->
|
||||
</tbody>
|
||||
</table>
|
||||
<!-- ELSE -->
|
||||
<p><strong>{L_NO_WARNINGS}</strong></p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
70
public/styles/prosilver/template/mcp_warn_list.html
Normal file
70
public/styles/prosilver/template/mcp_warn_list.html
Normal file
|
@ -0,0 +1,70 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<h2>{L_WARNED_USERS}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_WARNED_USERS_EXPLAIN}</p>
|
||||
|
||||
<!-- IF .user -->
|
||||
<div class="action-bar bar-top">
|
||||
<div class="pagination">
|
||||
{TOTAL_USERS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name">{L_USERNAME}</th>
|
||||
<th class="name">{L_WARNINGS}</th>
|
||||
<th class="name">{L_LATEST_WARNING_TIME}</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
<!-- BEGIN user -->
|
||||
<tr class="<!-- IF user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<td>{user.USERNAME_FULL}</td>
|
||||
<td>{user.WARNINGS}</td>
|
||||
<td>{user.WARNING_TIME}</td>
|
||||
<td><a href="{user.U_NOTES}">{L_VIEW_NOTES}</a></td>
|
||||
</tr>
|
||||
<!-- END user -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<div class="action-bar bottom">
|
||||
<!-- INCLUDE display_options.html -->
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL_USERS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ELSE -->
|
||||
<p><strong>{L_NO_WARNINGS}</strong></p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
|
||||
{S_FORM_TOKEN}
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
78
public/styles/prosilver/template/mcp_warn_post.html
Normal file
78
public/styles/prosilver/template/mcp_warn_post.html
Normal file
|
@ -0,0 +1,78 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<h2>{L_MCP_WARN_POST}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3><!-- IF USER_COLOR --><span style="color: #{USER_COLOR}">{USERNAME}</span><!-- ELSE -->{USERNAME}<!-- ENDIF --></h3>
|
||||
|
||||
<div>
|
||||
<div class="column1">
|
||||
<!-- IF AVATAR_IMG --><div>{AVATAR_IMG}</div><!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
<div class="column2">
|
||||
<dl class="details">
|
||||
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
|
||||
<!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE --> <!-- ELSE -->{L_RANK}{L_COLON}<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
|
||||
<dt>{L_JOINED}{L_COLON}</dt><dd>{JOINED}</dd>
|
||||
<dt>{L_TOTAL_POSTS}{L_COLON}</dt><dd>{POSTS}</dd>
|
||||
<dt>{L_WARNINGS}{L_COLON} </dt><dd>{WARNINGS}</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_POST_DETAILS}</h3>
|
||||
|
||||
<div class="postbody">
|
||||
|
||||
<div class="content">
|
||||
{POST}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- EVENT mcp_warn_post_add_warning_field_before -->
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_ADD_WARNING}</h3>
|
||||
<p>{L_ADD_WARNING_EXPLAIN}</p>
|
||||
|
||||
<fieldset>
|
||||
<textarea name="warning" id="warning" class="inputbox" cols="40" rows="3">{L_WARNING_POST_DEFAULT}</textarea>
|
||||
<!-- IF S_CAN_NOTIFY -->
|
||||
<br /><br />
|
||||
<dl class="panel">
|
||||
<dt> </dt>
|
||||
<dd><label><input type="checkbox" name="notify_user" checked="checked" /> {L_NOTIFY_USER_WARN}</label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- EVENT mcp_warn_post_add_warning_field_after -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
62
public/styles/prosilver/template/mcp_warn_user.html
Normal file
62
public/styles/prosilver/template/mcp_warn_user.html
Normal file
|
@ -0,0 +1,62 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
|
||||
<form method="post" id="mcp" action="{U_POST_ACTION}">
|
||||
|
||||
<h2>{L_WARN_USER}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{USERNAME_FULL}</h3>
|
||||
|
||||
<div>
|
||||
<div class="column1">
|
||||
<!-- IF AVATAR_IMG --><div>{AVATAR_IMG}</div><!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
<div class="column2">
|
||||
<dl class="details">
|
||||
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt><dd>{RANK_TITLE}</dd><!-- ENDIF -->
|
||||
<!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE --> <!-- ELSE -->{L_RANK}{L_COLON}<!-- ENDIF --></dt><dd>{RANK_IMG}</dd><!-- ENDIF -->
|
||||
<dt>{L_JOINED}{L_COLON}</dt><dd>{JOINED}</dd>
|
||||
<dt>{L_TOTAL_POSTS}{L_COLON}</dt><dd>{POSTS}</dd>
|
||||
<dt>{L_WARNINGS}{L_COLON} </dt><dd>{WARNINGS}</dd>
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- EVENT mcp_warn_user_add_warning_field_before -->
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_ADD_WARNING}</h3>
|
||||
<p>{L_ADD_WARNING_EXPLAIN}</p>
|
||||
|
||||
<fieldset>
|
||||
<textarea name="warning" id="warning" class="inputbox" cols="40" rows="3"></textarea>
|
||||
<!-- IF S_CAN_NOTIFY -->
|
||||
<br /><br />
|
||||
<dl class="panel">
|
||||
<dt> </dt>
|
||||
<dd><label><input type="checkbox" name="notify_user" checked="checked" /> {L_NOTIFY_USER_WARN}</label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- EVENT mcp_warn_user_add_warning_field_after -->
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="action[add_warning]" value="{L_SUBMIT}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
22
public/styles/prosilver/template/mcp_whois.html
Normal file
22
public/styles/prosilver/template/mcp_whois.html
Normal file
|
@ -0,0 +1,22 @@
|
|||
<!-- INCLUDE mcp_header.html -->
|
||||
<h2>{L_WHOIS}</h2>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<p>
|
||||
<a href="{U_RETURN_POST}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_POST}</span>
|
||||
</a>
|
||||
</p>
|
||||
<div class="postbody"><div class="content">
|
||||
<pre>{WHOIS}</pre>
|
||||
</div></div>
|
||||
<p>
|
||||
<a href="{U_RETURN_POST}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_RETURN_POST}</span>
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INCLUDE mcp_footer.html -->
|
190
public/styles/prosilver/template/memberlist_body.html
Normal file
190
public/styles/prosilver/template/memberlist_body.html
Normal file
|
@ -0,0 +1,190 @@
|
|||
<!-- IF S_IN_SEARCH_POPUP -->
|
||||
<!-- INCLUDE simple_header.html -->
|
||||
<!-- INCLUDE memberlist_search.html -->
|
||||
<form method="post" id="results" action="{S_MODE_ACTION}" onsubmit="insert_marked_users('#results', this.user); return false;" data-form-name="{S_FORM_NAME}" data-field-name="{S_FIELD_NAME}">
|
||||
|
||||
<!-- ELSE -->
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
<div class="panel" id="memberlist_search"<!-- IF not S_SEARCH_USER --> style="display: none;"<!-- ENDIF -->>
|
||||
<!-- INCLUDE memberlist_search.html -->
|
||||
</div>
|
||||
<form method="post" action="{S_MODE_ACTION}">
|
||||
|
||||
<!-- ENDIF -->
|
||||
|
||||
{% EVENT memberlist_body_page_header_after %}
|
||||
|
||||
<!-- IF S_SHOW_GROUP -->
|
||||
{% EVENT memberlist_body_group_name_before %}
|
||||
<h2 class="group-title"<!-- IF GROUP_COLOR --> style="color:#{GROUP_COLOR};"<!-- ENDIF -->>{GROUP_NAME}</h2>
|
||||
{% EVENT memberlist_body_group_name_after %}
|
||||
<!-- IF U_MANAGE -->
|
||||
<p class="right responsive-center manage rightside"><a href="{U_MANAGE}">{L_MANAGE_GROUP}</a></p>
|
||||
<!-- ENDIF -->
|
||||
<p>{GROUP_DESC} {GROUP_TYPE}</p>
|
||||
|
||||
{% EVENT memberlist_body_group_desc_after %}
|
||||
|
||||
<p>
|
||||
<!-- IF AVATAR_IMG -->{AVATAR_IMG}<!-- ENDIF -->
|
||||
{% EVENT memberlist_body_group_rank_before %}
|
||||
{% if RANK_IMG %}{{ RANK_IMG }}{% endif %}
|
||||
{% if GROUP_RANK %}
|
||||
{% if not RANK_IMG %}
|
||||
{{ lang('GROUP_RANK') ~ lang('COLON') }}
|
||||
{% endif %}
|
||||
{{ GROUP_RANK }}
|
||||
{% endif %}
|
||||
{% EVENT memberlist_body_group_rank_after %}
|
||||
</p>
|
||||
<!-- ELSE -->
|
||||
{% EVENT memberlist_body_page_title_before %}
|
||||
<h2 class="solo">{PAGE_TITLE}<!-- IF SEARCH_WORDS -->{L_COLON} <a href="{U_SEARCH_WORDS}">{SEARCH_WORDS}</a><!-- ENDIF --></h2>
|
||||
|
||||
<div class="action-bar bar-top">
|
||||
<div class="member-search panel">
|
||||
<!-- IF U_FIND_MEMBER and not S_SEARCH_USER --><a href="{U_FIND_MEMBER}" id="member_search" data-alt-text="{L_HIDE_MEMBER_SEARCH}">{L_FIND_USERNAME}</a> • <!-- ELSEIF S_SEARCH_USER and U_HIDE_FIND_MEMBER and not S_IN_SEARCH_POPUP --><a href="{U_HIDE_FIND_MEMBER}" id="member_search" data-alt-text="{L_FIND_USERNAME}">{L_HIDE_MEMBER_SEARCH}</a> • <!-- ENDIF -->
|
||||
<strong>
|
||||
<!-- BEGIN first_char -->
|
||||
<a href="{first_char.U_SORT}">{first_char.DESC}</a>
|
||||
<!-- END first_char -->
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<div class="pagination">
|
||||
{TOTAL_USERS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_LEADERS_SET or not S_SHOW_GROUP or not .memberrow -->
|
||||
<div class="forumbg forumbg-table">
|
||||
<div class="inner">
|
||||
|
||||
<table class="table1 memberlist" id="memberlist">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}<!-- IF S_SHOW_GROUP and .memberrow -->{L_GROUP_LEADER}<!-- ELSE -->{L_USERNAME}<!-- ENDIF -->"><span class="rank-img"><a href="{U_SORT_RANK}">{L_RANK}</a></span><a href="{U_SORT_USERNAME}"><!-- IF S_SHOW_GROUP and .memberrow -->{L_GROUP_LEADER}<!-- ELSE -->{L_USERNAME}<!-- ENDIF --></a></th>
|
||||
<th class="posts"><a href="{U_SORT_POSTS}#memberlist">{L_POSTS}</a></th>
|
||||
<th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
|
||||
<th class="joined"><a href="{U_SORT_JOINED}#memberlist">{L_JOINED}</a></th>
|
||||
<!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->
|
||||
{% EVENT memberlist_body_memberlist_after %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- ENDIF -->
|
||||
<!-- BEGIN memberrow -->
|
||||
<!-- IF S_SHOW_GROUP -->
|
||||
<!-- IF not memberrow.S_GROUP_LEADER and not $S_MEMBER_HEADER -->
|
||||
<!-- IF S_LEADERS_SET and memberrow.S_FIRST_ROW -->
|
||||
<tr class="bg1">
|
||||
<td colspan="<!-- IF U_SORT_ACTIVE -->5<!-- ELSE -->4<!-- ENDIF -->"> </td>
|
||||
</tr>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_LEADERS_SET -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<div class="forumbg forumbg-table">
|
||||
<div class="inner">
|
||||
|
||||
<table class="table1">
|
||||
<thead>
|
||||
<tr>
|
||||
<!-- IF not S_LEADERS_SET -->
|
||||
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}{L_USERNAME}"><span class="rank-img"><a href="{U_SORT_RANK}">{L_RANK}</a></span><a href="{U_SORT_USERNAME}"><!-- IF S_SHOW_GROUP -->{L_GROUP_MEMBERS}<!-- ELSE -->{L_USERNAME}<!-- ENDIF --></a></th>
|
||||
<th class="posts"><a href="{U_SORT_POSTS}#memberlist">{L_POSTS}</a></th>
|
||||
<th class="info">{% for field in custom_fields %}{% if not loop.first %}{L_COMMA_SEPARATOR} {% endif %}{{ field.PROFILE_FIELD_NAME }}{% endfor %}</th>
|
||||
<th class="joined"><a href="{U_SORT_JOINED}#memberlist">{L_JOINED}</a></th>
|
||||
<!-- IF U_SORT_ACTIVE --><th class="active"><a href="{U_SORT_ACTIVE}#memberlist">{L_LAST_ACTIVE}</a></th><!-- ENDIF -->
|
||||
{% EVENT memberlist_body_leaders_set_after %}
|
||||
<!-- ELSEIF S_SHOW_GROUP -->
|
||||
<th class="name">{L_GROUP_MEMBERS}</th>
|
||||
<th class="posts">{L_POSTS}</th>
|
||||
<th class="info"><!-- BEGIN custom_fields --><!-- IF not custom_fields.S_FIRST_ROW -->{L_COMMA_SEPARATOR} <!-- ENDIF -->{custom_fields.PROFILE_FIELD_NAME}<!-- END custom_fields --></th>
|
||||
<th class="joined">{L_JOINED}</th>
|
||||
<!-- IF U_SORT_ACTIVE --><th class="active">{L_LAST_ACTIVE}</th><!-- ENDIF -->
|
||||
{% EVENT memberlist_body_show_group_after %}
|
||||
<!-- ENDIF -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- DEFINE $S_MEMBER_HEADER = 1 -->
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<tr class="<!-- IF memberrow.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF memberrow.S_INACTIVE --> inactive<!-- ENDIF -->">
|
||||
<td><span class="rank-img"><!-- EVENT memberlist_body_rank_prepend --><!-- IF memberrow.RANK_IMG -->{memberrow.RANK_IMG}<!-- ELSE -->{memberrow.RANK_TITLE}<!-- ENDIF --><!-- EVENT memberlist_body_rank_append --></span><!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE --><input type="checkbox" name="user" value="{memberrow.USERNAME}" /> <!-- ENDIF --><!-- EVENT memberlist_body_username_prepend -->{memberrow.USERNAME_FULL}<!-- IF memberrow.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --><!-- EVENT memberlist_body_username_append --><!-- IF S_IN_SEARCH_POPUP --><br />[ <a href="#" onclick="insert_single_user('#results', '{memberrow.A_USERNAME}'); return false;">{L_SELECT}</a> ]<!-- ENDIF --></td>
|
||||
<td class="posts"><!-- IF memberrow.POSTS and S_DISPLAY_SEARCH --><a href="{memberrow.U_SEARCH_USER}" title="{L_SEARCH_USER_POSTS}">{memberrow.POSTS}</a><!-- ELSE -->{memberrow.POSTS}<!-- ENDIF --></td>
|
||||
<td class="info">
|
||||
{%- for field in memberrow.custom_fields -%}
|
||||
<div>{% if field.S_PROFILE_CONTACT %}<a href="{{ field.PROFILE_FIELD_CONTACT }}">{% endif %}{{ field.PROFILE_FIELD_VALUE }}{% if field.S_PROFILE_CONTACT %}</a>{% endif %}</div>
|
||||
{%- else -%}
|
||||
|
||||
{%- endfor -%}
|
||||
</td>
|
||||
<td>{memberrow.JOINED}</td>
|
||||
<!-- IF S_VIEWONLINE --><td>{memberrow.LAST_ACTIVE} </td><!-- ENDIF -->
|
||||
{% EVENT memberlist_body_memberrow_after %}
|
||||
</tr>
|
||||
<!-- BEGINELSE -->
|
||||
<tr class="bg1">
|
||||
<td colspan="<!-- IF S_VIEWONLINE -->5<!-- ELSE -->4<!-- ENDIF -->">{L_NO_MEMBERS}</td>
|
||||
</tr>
|
||||
<!-- END memberrow -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_IN_SEARCH_POPUP and not S_SELECT_SINGLE -->
|
||||
<fieldset class="display-actions">
|
||||
<input type="submit" name="submit" value="{L_SELECT_MARKED}" class="button2" />
|
||||
<div><a href="#" onclick="marklist('results', 'user', true); return false;">{L_MARK_ALL}</a> • <a href="#" onclick="marklist('results', 'user', false); return false;">{L_UNMARK_ALL}</a></div>
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_IN_SEARCH_POPUP -->
|
||||
</form>
|
||||
<form method="post" id="sort-results" action="{S_MODE_ACTION}">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_IN_SEARCH_POPUP and not S_SEARCH_USER -->
|
||||
<fieldset class="display-options">
|
||||
<label for="sk">{L_SELECT_SORT_METHOD}{L_COLON} <select name="sk" id="sk">{S_MODE_SELECT}</select></label>
|
||||
<label for="sd">{L_ORDER} <select name="sd" id="sd">{S_ORDER_SELECT}</select></label>
|
||||
<input type="submit" name="sort" value="{L_SUBMIT}" class="button2" />
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</form>
|
||||
|
||||
<div class="action-bar bar-bottom">
|
||||
<div class="pagination">
|
||||
{TOTAL_USERS}
|
||||
<!-- IF .pagination -->
|
||||
<!-- INCLUDE pagination.html -->
|
||||
<!-- ELSE -->
|
||||
• {PAGE_NUMBER}
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% EVENT memberlist_body_page_footer_before %}
|
||||
|
||||
<!-- IF S_IN_SEARCH_POPUP -->
|
||||
<!-- INCLUDE simple_footer.html -->
|
||||
<!-- ELSE -->
|
||||
<!-- INCLUDE jumpbox.html -->
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
<!-- ENDIF -->
|
107
public/styles/prosilver/template/memberlist_email.html
Normal file
107
public/styles/prosilver/template/memberlist_email.html
Normal file
|
@ -0,0 +1,107 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<!-- EVENT memberlist_email_before -->
|
||||
|
||||
<!-- IF S_CONTACT_ADMIN-->
|
||||
<h2 class="titlespace">{L_CONTACT_ADMIN}</h2>
|
||||
<!-- ELSEIF S_SEND_USER -->
|
||||
<h2 class="titlespace">{L_SEND_EMAIL_USER}</h2>
|
||||
<!-- ELSE -->
|
||||
<h2 class="titlespace">{L_EMAIL_TOPIC}</h2>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<form method="post" action="{S_POST_ACTION}" id="post">
|
||||
|
||||
<!-- IF CONTACT_INFO -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<div class="postbody">
|
||||
<div class="content">
|
||||
{CONTACT_INFO}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<br class="clear" />
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<div class="content">
|
||||
|
||||
<!-- IF ERROR_MESSAGE --><p class="error">{ERROR_MESSAGE}</p><!-- ENDIF -->
|
||||
<fieldset class="fields2">
|
||||
<!-- IF S_SEND_USER -->
|
||||
<dl>
|
||||
<dt><label>{L_RECIPIENT}{L_COLON}</label></dt>
|
||||
<dd><strong>{USERNAME_FULL}</strong></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox autowidth" type="text" name="subject" id="subject" size="50" tabindex="1" value="{SUBJECT}" /></dd>
|
||||
</dl>
|
||||
<!-- ELSEIF S_CONTACT_ADMIN-->
|
||||
<dl>
|
||||
<dt><label>{L_RECIPIENT}{L_COLON}</label></dt>
|
||||
<dd><strong>{L_ADMINISTRATOR}</strong></dd>
|
||||
</dl>
|
||||
<!-- IF not S_IS_REGISTERED -->
|
||||
<dl>
|
||||
<dt><label for="email">{L_SENDER_EMAIL_ADDRESS}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox autowidth" type="text" name="email" id="email" size="50" maxlength="100" tabindex="1" value="{EMAIL}" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="name">{L_SENDER_NAME}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox autowidth" type="text" name="name" id="name" size="50" tabindex="2" value="{NAME}" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<dl>
|
||||
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox autowidth" type="text" name="subject" id="subject" size="50" tabindex="3" value="{SUBJECT}" /></dd>
|
||||
</dl>
|
||||
<!-- ELSE -->
|
||||
<dl>
|
||||
<dt><label for="email">{L_EMAIL_ADDRESS}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox autowidth" type="email" name="email" id="email" size="50" maxlength="100" tabindex="2" value="{EMAIL}" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="name">{L_REAL_NAME}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox autowidth" type="text" name="name" id="name" size="50" tabindex="3" value="{NAME}" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="lang">{L_DEST_LANG}{L_COLON}</label><br />
|
||||
<span>{L_DEST_LANG_EXPLAIN}</span></dt>
|
||||
<dd><select name="lang">{S_LANG_OPTIONS}</select></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<dl>
|
||||
<dt><label for="message">{L_MESSAGE_BODY}{L_COLON}</label><br />
|
||||
<span>{L_EMAIL_BODY_EXPLAIN}</span></dt>
|
||||
<dd><textarea class="inputbox" name="message" id="message" rows="15" cols="76" tabindex="4">{MESSAGE}</textarea></dd>
|
||||
</dl>
|
||||
<!-- IF S_REGISTERED_USER -->
|
||||
<dl>
|
||||
<dt> </dt>
|
||||
<dd><label for="cc_sender"><input type="checkbox" name="cc_sender" id="cc_sender" value="1" checked="checked" tabindex="5" /> {L_CC_SENDER}</label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<div class="content">
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="submit" tabindex="6" name="submit" class="button1" value="{L_SEND_EMAIL}" />
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
{S_FORM_TOKEN}
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
46
public/styles/prosilver/template/memberlist_im.html
Normal file
46
public/styles/prosilver/template/memberlist_im.html
Normal file
|
@ -0,0 +1,46 @@
|
|||
<!-- INCLUDE simple_header.html -->
|
||||
|
||||
<h2>{L_SEND_IM}</h2>
|
||||
|
||||
<form method="post" action="{S_IM_ACTION}">
|
||||
|
||||
<div class="panel bg2">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_SEND_IM_EXPLAIN}</p>
|
||||
|
||||
<!-- IF S_SENT_JABBER -->
|
||||
<p>{L_IM_SENT_JABBER}</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<fieldset>
|
||||
<dl class="fields2">
|
||||
<dt><label>{L_IM_RECIPIENT}{L_COLON}</label></dt>
|
||||
<dd><strong>{USERNAME}</strong><!-- IF S_NO_SEND_JABBER --> [ {IM_CONTACT} ]<!-- ENDIF --><!-- IF PRESENCE_IMG --> {PRESENCE_IMG}<!-- ENDIF --></dd>
|
||||
</dl>
|
||||
|
||||
<!-- IF S_SEND_JABBER -->
|
||||
<dl class="fields2">
|
||||
<dt><label for="message">{L_IM_MESSAGE}{L_COLON}</label></dt>
|
||||
<dd><textarea class="inputbox autowidth" name="message" id="message" rows="5" cols="45"></textarea></dd>
|
||||
</dl>
|
||||
<dl class="fields2">
|
||||
<dt> </dt>
|
||||
<dd><input class="button1" name="submit" type="submit" value="{L_IM_SEND}" /></dd>
|
||||
</dl>
|
||||
<!-- ELSE IF S_NO_SEND_JABBER -->
|
||||
<dl class="fields2">
|
||||
<dt> </dt>
|
||||
<dd>{L_IM_NO_JABBER}</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<a href="#" onclick="window.close(); return false;">{L_CLOSE_WINDOW}</a>
|
||||
|
||||
<!-- INCLUDE simple_footer.html -->
|
87
public/styles/prosilver/template/memberlist_search.html
Normal file
87
public/styles/prosilver/template/memberlist_search.html
Normal file
|
@ -0,0 +1,87 @@
|
|||
<h2 class="solo">{L_FIND_USERNAME}</h2>
|
||||
|
||||
<form method="post" action="{S_MODE_ACTION}" id="search_memberlist">
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_FIND_USERNAME_EXPLAIN}</p>
|
||||
|
||||
<!-- EVENT memberlist_search_fields_before -->
|
||||
<fieldset class="fields1 column1">
|
||||
<dl style="overflow: visible;">
|
||||
<dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
|
||||
<dd>
|
||||
<!-- IF U_LIVE_SEARCH --><div class="dropdown-container dropdown-{S_CONTENT_FLOW_END}"><!-- ENDIF -->
|
||||
<input type="text" name="username" id="username" value="{USERNAME}" class="inputbox"<!-- IF U_LIVE_SEARCH --> autocomplete="off" data-filter="phpbb.search.filter" data-ajax="member_search" data-min-length="3" data-url="{U_LIVE_SEARCH}" data-results="#user-search"<!-- ENDIF --> />
|
||||
<!-- IF U_LIVE_SEARCH -->
|
||||
<div class="dropdown live-search hidden" id="user-search">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<ul class="dropdown-contents search-results">
|
||||
<li class="search-result-tpl"><span class="search-result"></span></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- IF S_EMAIL_SEARCH_ALLOWED -->
|
||||
<dl>
|
||||
<dt><label for="email">{L_EMAIL}{L_COLON}</label></dt>
|
||||
<dd><input type="text" name="email" id="email" value="{EMAIL}" class="inputbox" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_JABBER_ENABLED -->
|
||||
<dl>
|
||||
<dt><label for="jabber">{L_JABBER}{L_COLON}</label></dt>
|
||||
<dd><input type="text" name="jabber" id="jabber" value="{JABBER}" class="inputbox" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<dl>
|
||||
<dt><label for="search_group_id">{L_GROUP}{L_COLON}</label></dt>
|
||||
<dd><select name="search_group_id" id="search_group_id">{S_GROUP_SELECT}</select></dd>
|
||||
</dl>
|
||||
<!-- EVENT memberlist_search_sorting_options_before -->
|
||||
<dl>
|
||||
<dt><label for="sk" class="label3">{L_SORT_BY}{L_COLON}</label></dt>
|
||||
<dd><select name="sk" id="sk">{S_SORT_OPTIONS}</select> <select name="sd">{S_ORDER_SELECT}</select></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
<fieldset class="fields1 column2">
|
||||
<dl>
|
||||
<dt><label for="joined">{L_JOINED}{L_COLON}</label></dt>
|
||||
<dd><select name="joined_select">{S_JOINED_TIME_OPTIONS}</select> <input class="inputbox medium" type="text" name="joined" id="joined" value="{JOINED}" /></dd>
|
||||
</dl>
|
||||
<!-- IF S_VIEWONLINE -->
|
||||
<dl>
|
||||
<dt><label for="active">{L_LAST_ACTIVE}{L_COLON}</label></dt>
|
||||
<dd><select name="active_select">{S_ACTIVE_TIME_OPTIONS}</select> <input class="inputbox medium" type="text" name="active" id="active" value="{ACTIVE}" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<dl>
|
||||
<dt><label for="count">{L_POSTS}{L_COLON}</label></dt>
|
||||
<dd><select name="count_select">{S_COUNT_OPTIONS}</select> <input class="inputbox medium" type="number" min="0" name="count" id="count" value="{COUNT}" /></dd>
|
||||
</dl>
|
||||
<!-- IF S_IP_SEARCH_ALLOWED -->
|
||||
<dl>
|
||||
<dt><label for="ip">{L_POST_IP}{L_COLON}</label></dt>
|
||||
<dd><input class="inputbox medium" type="text" name="ip" id="ip" value="{IP}" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT memberlist_search_fields_after -->
|
||||
</fieldset>
|
||||
|
||||
<div class="clear"></div>
|
||||
|
||||
<hr />
|
||||
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="reset" value="{L_RESET}" name="reset" class="button2" />
|
||||
<input type="submit" name="submit" value="{L_SEARCH}" class="button1" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
47
public/styles/prosilver/template/memberlist_team.html
Normal file
47
public/styles/prosilver/template/memberlist_team.html
Normal file
|
@ -0,0 +1,47 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<h2 class="solo">{PAGE_TITLE}</h2>
|
||||
|
||||
<form method="post" action="{S_MODE_ACTION}">
|
||||
|
||||
<!-- BEGIN group -->
|
||||
<div class="forumbg forumbg-table">
|
||||
<div class="inner">
|
||||
|
||||
<table class="table1" id="team">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="name" data-dfn="{L_RANK}{L_COMMA_SEPARATOR}{L_USERNAME}"><span class="rank-img">{L_RANK} </span><!-- IF group.U_GROUP --><a href="{group.U_GROUP}">{group.GROUP_NAME}</a><!-- ELSE -->{group.GROUP_NAME}<!-- ENDIF --></th>
|
||||
<th class="info">{L_PRIMARY_GROUP}</th>
|
||||
<!-- IF S_DISPLAY_MODERATOR_FORUMS --><th class="info">{L_MODERATOR}</th><!-- ENDIF -->
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<!-- BEGIN user -->
|
||||
<tr class="<!-- IF group.user.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF group.user.S_INACTIVE --> inactive<!-- ENDIF -->">
|
||||
<td><!-- IF group.user.RANK_IMG --><span class="rank-img">{group.user.RANK_IMG}</span><!-- ELSE --><span class="rank-img">{group.user.RANK_TITLE}</span><!-- ENDIF --><!-- EVENT memberlist_team_username_prepend -->{group.user.USERNAME_FULL}<!-- IF group.user.S_INACTIVE --> ({L_INACTIVE})<!-- ENDIF --><!-- EVENT memberlist_team_username_append --></td>
|
||||
<td class="info"><!-- IF group.user.U_GROUP -->
|
||||
<a<!-- IF group.user.GROUP_COLOR --> style="font-weight: bold; color: #{group.user.GROUP_COLOR}"<!-- ENDIF --> href="{group.user.U_GROUP}">{group.user.GROUP_NAME}</a>
|
||||
<!-- ELSE -->
|
||||
{group.user.GROUP_NAME}
|
||||
<!-- ENDIF --></td>
|
||||
<!-- IF S_DISPLAY_MODERATOR_FORUMS -->
|
||||
<td class="info"><!-- IF group.user.FORUM_OPTIONS --><select style="width: 100%;">{group.user.FORUMS}</select><!-- ELSEIF group.user.FORUMS -->{group.user.FORUMS}<!-- ELSE -->-<!-- ENDIF --></td>
|
||||
<!-- ENDIF -->
|
||||
</tr>
|
||||
<!-- BEGINELSE -->
|
||||
<tr class="bg1">
|
||||
<td colspan="3"><strong>{L_NO_MEMBERS}</strong></td>
|
||||
</tr>
|
||||
<!-- END user -->
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- END group -->
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE jumpbox.html -->
|
||||
<!-- INCLUDE overall_footer.html -->
|
142
public/styles/prosilver/template/memberlist_view.html
Normal file
142
public/styles/prosilver/template/memberlist_view.html
Normal file
|
@ -0,0 +1,142 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<h2 class="memberlist-title">{PAGE_TITLE}</h2>
|
||||
|
||||
<!-- EVENT memberlist_view_content_prepend -->
|
||||
|
||||
<form method="post" action="{S_PROFILE_ACTION}" id="viewprofile">
|
||||
<div class="panel bg1<!-- IF S_ONLINE --> online<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
|
||||
<!-- IF AVATAR_IMG -->
|
||||
<dl class="left-box">
|
||||
<dt class="profile-avatar">{AVATAR_IMG}</dt>
|
||||
<!-- EVENT memberlist_view_rank_avatar_before -->
|
||||
<!-- IF RANK_TITLE --><dd style="text-align: center;">{RANK_TITLE}</dd><!-- ENDIF -->
|
||||
<!-- IF RANK_IMG --><dd style="text-align: center;">{RANK_IMG}</dd><!-- ENDIF -->
|
||||
<!-- EVENT memberlist_view_rank_avatar_after -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<dl class="left-box details profile-details">
|
||||
<dt>{L_USERNAME}{L_COLON}</dt>
|
||||
<dd>
|
||||
<!-- EVENT memberlist_view_username_prepend --><!-- IF USER_COLOR --><span style="color: {USER_COLOR}; font-weight: bold;"><!-- ELSE --><span><!-- ENDIF -->{USERNAME}</span><!-- EVENT memberlist_view_username_append -->
|
||||
<!-- IF U_EDIT_SELF --> [ <a href="{U_EDIT_SELF}">{L_EDIT_PROFILE}</a> ]<!-- ENDIF -->
|
||||
<!-- IF U_USER_ADMIN --> [ <a href="{U_USER_ADMIN}">{L_USER_ADMIN}</a> ]<!-- ENDIF -->
|
||||
<!-- IF U_USER_BAN --> [ <a href="{U_USER_BAN}">{L_USER_BAN}</a> ]<!-- ENDIF -->
|
||||
<!-- IF U_SWITCH_PERMISSIONS --> [ <a href="{U_SWITCH_PERMISSIONS}">{L_USE_PERMISSIONS}</a> ]<!-- ENDIF -->
|
||||
</dd>
|
||||
<!-- IF not AVATAR_IMG -->
|
||||
<!-- EVENT memberlist_view_rank_no_avatar_before -->
|
||||
<!-- IF RANK_TITLE --><dt>{L_RANK}{L_COLON}</dt> <dd>{RANK_TITLE}</dd><!-- ENDIF -->
|
||||
<!-- IF RANK_IMG --><dt><!-- IF RANK_TITLE --> <!-- ELSE -->{L_RANK}{L_COLON}<!-- ENDIF --></dt> <dd>{RANK_IMG}</dd><!-- ENDIF -->
|
||||
<!-- EVENT memberlist_view_rank_no_avatar_after -->
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_USER_INACTIVE --><dt>{L_USER_IS_INACTIVE}{L_COLON}</dt> <dd>{USER_INACTIVE_REASON}</dd><!-- ENDIF -->
|
||||
<!-- IF AGE !== '' --><dt>{L_AGE}{L_COLON}</dt> <dd>{AGE}</dd><!-- ENDIF -->
|
||||
<!-- IF S_GROUP_OPTIONS --><dt>{L_USERGROUPS}{L_COLON}</dt> <dd><select name="g">{S_GROUP_OPTIONS}</select> <input type="submit" name="submit" value="{L_GO}" class="button2" /></dd><!-- ENDIF -->
|
||||
<!-- EVENT memberlist_view_non_contact_custom_fields_before -->
|
||||
<!-- BEGIN custom_fields -->
|
||||
<!-- IF not custom_fields.S_PROFILE_CONTACT -->
|
||||
<dt>{custom_fields.PROFILE_FIELD_NAME}{L_COLON}</dt> <dd>{custom_fields.PROFILE_FIELD_VALUE}</dd>
|
||||
<!-- ENDIF -->
|
||||
<!-- END custom_fields -->
|
||||
<!-- EVENT memberlist_view_non_contact_custom_fields_after -->
|
||||
<!-- EVENT memberlist_view_zebra_before -->
|
||||
<!-- IF S_USER_LOGGED_IN and S_ZEBRA -->
|
||||
<!-- IF U_REMOVE_FRIEND -->
|
||||
<dt> </dt> <dd class="zebra"><a href="{U_REMOVE_FRIEND}" data-ajax="zebra"><strong>{L_REMOVE_FRIEND}</strong></a></dd>
|
||||
<!-- ELSEIF U_REMOVE_FOE -->
|
||||
<dt> </dt> <dd class="zebra"><a href="{U_REMOVE_FOE}" data-ajax="zebra"><strong>{L_REMOVE_FOE}</strong></a></dd>
|
||||
<!-- ELSE -->
|
||||
<!-- IF U_ADD_FRIEND -->
|
||||
<dt> </dt> <dd class="zebra"><a href="{U_ADD_FRIEND}" data-ajax="zebra"><strong>{L_ADD_FRIEND}</strong></a></dd>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF U_ADD_FOE -->
|
||||
<dt> </dt> <dd class="zebra"><a href="{U_ADD_FOE}" data-ajax="zebra"><strong>{L_ADD_FOE}</strong></a></dd>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT memberlist_view_zebra_after -->
|
||||
</dl>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- EVENT memberlist_view_contact_before -->
|
||||
<div class="panel bg2">
|
||||
<div class="inner">
|
||||
|
||||
<div class="column1">
|
||||
<h3>{L_CONTACT_USER}</h3>
|
||||
|
||||
<dl class="details">
|
||||
<!-- IF U_EMAIL --><dt>{L_EMAIL_ADDRESS}{L_COLON}</dt> <dd><a href="{U_EMAIL}">{L_SEND_EMAIL_USER}</a></dd><!-- ENDIF -->
|
||||
<!-- IF U_PM --><dt>{L_PM}{L_COLON}</dt> <dd><a href="{U_PM}">{L_SEND_PRIVATE_MESSAGE}</a></dd><!-- ENDIF -->
|
||||
<!-- IF U_JABBER and S_JABBER_ENABLED --><dt>{L_JABBER}{L_COLON}</dt> <dd><a href="{U_JABBER}" onclick="popup(this.href, 750, 320); return false;">{L_SEND_JABBER_MESSAGE}</a></dd><!-- ELSEIF USER_JABBER --><dt>{L_JABBER}{L_COLON}</dt> <dd>{USER_JABBER}</dd><!-- ENDIF -->
|
||||
<!-- EVENT memberlist_view_contact_custom_fields_before -->
|
||||
<!-- BEGIN custom_fields -->
|
||||
<!-- IF custom_fields.S_PROFILE_CONTACT -->
|
||||
<dt>{custom_fields.PROFILE_FIELD_NAME}{L_COLON}</dt>
|
||||
<!-- IF custom_fields.PROFILE_FIELD_CONTACT -->
|
||||
<dd><a href="{custom_fields.PROFILE_FIELD_CONTACT}">{custom_fields.PROFILE_FIELD_DESC}</a></dd>
|
||||
<!-- ELSE -->
|
||||
<dd>{custom_fields.PROFILE_FIELD_VALUE}</dd>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
<!-- END custom_fields -->
|
||||
<!-- EVENT memberlist_view_contact_custom_fields_after -->
|
||||
<!-- IF S_PROFILE_FIELD1 -->
|
||||
<!-- NOTE: Use a construct like this to include admin defined profile fields. Replace FIELD1 with the name of your field. -->
|
||||
<dt>{PROFILE_FIELD1_NAME}{L_COLON}</dt> <dd>{PROFILE_FIELD1_VALUE}</dd>
|
||||
<!-- ENDIF -->
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<div class="column2">
|
||||
<h3>{L_USER_FORUM}</h3>
|
||||
<dl class="details">
|
||||
<!-- EVENT memberlist_view_user_statistics_before -->
|
||||
<dt>{L_JOINED}{L_COLON}</dt> <dd>{JOINED}</dd>
|
||||
<dt>{L_LAST_ACTIVE}{L_COLON}</dt> <dd>{LAST_ACTIVE}</dd>
|
||||
<!-- IF S_WARNINGS -->
|
||||
<dt>{L_WARNINGS}{L_COLON} </dt>
|
||||
<dd><strong>{WARNINGS}</strong><!-- IF U_NOTES or U_WARN --> [ <!-- IF U_NOTES --><a href="{U_NOTES}">{L_VIEW_NOTES}</a><!-- ENDIF --> <!-- IF U_WARN --><!-- IF U_NOTES --> | <!-- ENDIF --><a href="{U_WARN}">{L_WARN_USER}</a><!-- ENDIF --> ]<!-- ENDIF --></dd>
|
||||
<!-- ENDIF -->
|
||||
<dt>{L_TOTAL_POSTS}{L_COLON}</dt>
|
||||
<dd>{POSTS} <!-- IF S_DISPLAY_SEARCH -->| <strong><a href="{U_SEARCH_USER}">{L_SEARCH_USER_POSTS}</a></strong><!-- ENDIF -->
|
||||
<!-- IF POSTS_PCT --><br />({POSTS_PCT} / {POSTS_DAY})<!-- ENDIF -->
|
||||
<!-- IF POSTS_IN_QUEUE and U_MCP_QUEUE --><br />(<a href="{U_MCP_QUEUE}">{L_POSTS_IN_QUEUE}</a>)<!-- ELSEIF POSTS_IN_QUEUE --><br />({L_POSTS_IN_QUEUE})<!-- ENDIF -->
|
||||
</dd>
|
||||
<!-- IF S_SHOW_ACTIVITY and POSTS -->
|
||||
<dt>{L_ACTIVE_IN_FORUM}{L_COLON}</dt> <dd><!-- IF ACTIVE_FORUM != '' --><strong><a href="{U_ACTIVE_FORUM}">{ACTIVE_FORUM}</a></strong><br />({ACTIVE_FORUM_POSTS} / {ACTIVE_FORUM_PCT})<!-- ELSE --> - <!-- ENDIF --></dd>
|
||||
<dt>{L_ACTIVE_IN_TOPIC}{L_COLON}</dt> <dd><!-- IF ACTIVE_TOPIC != '' --><strong><a href="{U_ACTIVE_TOPIC}">{ACTIVE_TOPIC}</a></strong><br />({ACTIVE_TOPIC_POSTS} / {ACTIVE_TOPIC_PCT})<!-- ELSE --> - <!-- ENDIF --></dd>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT memberlist_view_user_statistics_after -->
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- EVENT memberlist_view_contact_after -->
|
||||
|
||||
<!-- IF SIGNATURE -->
|
||||
<div class="panel bg1">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_SIGNATURE}</h3>
|
||||
|
||||
<div class="postbody"><div class="signature standalone">{SIGNATURE}</div></div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</form>
|
||||
|
||||
<!-- EVENT memberlist_view_content_append -->
|
||||
|
||||
<!-- INCLUDE jumpbox.html -->
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
25
public/styles/prosilver/template/message_body.html
Normal file
25
public/styles/prosilver/template/message_body.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<!-- IF S_SIMPLE_MESSAGE -->
|
||||
<!-- INCLUDE simple_header.html -->
|
||||
<!-- ELSE -->
|
||||
<!-- INCLUDE overall_header.html -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="panel" id="message">
|
||||
<div class="inner">
|
||||
<h2 class="message-title">{MESSAGE_TITLE}</h2>
|
||||
<p>{MESSAGE_TEXT}</p>
|
||||
<!-- IF SCRIPT_NAME == "search" and not S_BOARD_DISABLED and not S_NO_SEARCH and L_RETURN_TO_SEARCH_ADV -->
|
||||
<p>
|
||||
<a href="{U_SEARCH}" class="arrow-{S_CONTENT_FLOW_BEGIN}" accesskey="r">
|
||||
<i class="icon fa-angle-{S_CONTENT_FLOW_BEGIN} fa-fw icon-black" aria-hidden="true"></i><span>{L_GO_TO_SEARCH_ADV}</span>
|
||||
</a>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_SIMPLE_MESSAGE -->
|
||||
<!-- INCLUDE simple_footer.html -->
|
||||
<!-- ELSE -->
|
||||
<!-- INCLUDE overall_footer.html -->
|
||||
<!-- ENDIF -->
|
69
public/styles/prosilver/template/navbar_footer.html
Normal file
69
public/styles/prosilver/template/navbar_footer.html
Normal file
|
@ -0,0 +1,69 @@
|
|||
<div class="navbar" role="navigation">
|
||||
<div class="inner">
|
||||
|
||||
<ul id="nav-footer" class="nav-footer linklist" role="menubar">
|
||||
<li class="breadcrumbs">
|
||||
<!-- IF U_SITE_HOME -->
|
||||
{% apply spaceless %}
|
||||
<span class="crumb">
|
||||
<a href="{U_SITE_HOME}" data-navbar-reference="home">
|
||||
<i class="icon fa-home fa-fw" aria-hidden="true"></i><span>{L_SITE_HOME}</span>
|
||||
</a>
|
||||
</span>
|
||||
{% endapply %}
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT overall_footer_breadcrumb_prepend -->
|
||||
{% apply spaceless %}
|
||||
<span class="crumb">
|
||||
<a href="{U_INDEX}" data-navbar-reference="index">
|
||||
<!-- IF not U_SITE_HOME --><i class="icon fa-home fa-fw" aria-hidden="true"></i><!-- ENDIF --><span>{L_INDEX}</span>
|
||||
</a>
|
||||
</span>
|
||||
{% endapply %}
|
||||
<!-- EVENT overall_footer_breadcrumb_append -->
|
||||
</li>
|
||||
<!-- IF U_WATCH_FORUM_LINK and not S_IS_BOT -->
|
||||
<li data-last-responsive="true">
|
||||
<a href="{U_WATCH_FORUM_LINK}" title="{S_WATCH_FORUM_TITLE}" data-ajax="toggle_link" data-toggle-class="icon <!-- IF S_WATCHING_FORUM -->fa-check-square-o<!-- ELSE -->fa-square-o<!-- ENDIF --> fa-fw" data-toggle-text="{S_WATCH_FORUM_TOGGLE}" data-toggle-url="{U_WATCH_FORUM_TOGGLE}">
|
||||
<i class="icon <!-- IF S_WATCHING_FORUM -->fa-square-o<!-- ELSE -->fa-check-square-o<!-- ENDIF --> fa-fw" aria-hidden="true"></i><span>{S_WATCH_FORUM_TITLE}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT overall_footer_timezone_before -->
|
||||
<li class="rightside">{S_TIMEZONE}</li>
|
||||
<!-- EVENT overall_footer_timezone_after -->
|
||||
<!-- IF not S_IS_BOT -->
|
||||
<li class="rightside">
|
||||
<a href="{U_DELETE_COOKIES}" data-ajax="true" data-refresh="true" role="menuitem">
|
||||
<i class="icon fa-trash fa-fw" aria-hidden="true"></i><span>{L_DELETE_COOKIES}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- IF S_DISPLAY_MEMBERLIST -->
|
||||
<li class="rightside" data-last-responsive="true">
|
||||
<a href="{U_MEMBERLIST}" title="{L_MEMBERLIST_EXPLAIN}" role="menuitem">
|
||||
<i class="icon fa-group fa-fw" aria-hidden="true"></i><span>{L_MEMBERLIST}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT overall_footer_teamlink_before -->
|
||||
<!-- IF U_TEAM -->
|
||||
<li class="rightside" data-last-responsive="true">
|
||||
<a href="{U_TEAM}" role="menuitem">
|
||||
<i class="icon fa-shield fa-fw" aria-hidden="true"></i><span>{L_THE_TEAM}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT overall_footer_teamlink_after -->
|
||||
<!-- IF U_CONTACT_US -->
|
||||
<li class="rightside" data-last-responsive="true">
|
||||
<a href="{U_CONTACT_US}" role="menuitem">
|
||||
<i class="icon fa-envelope fa-fw" aria-hidden="true"></i><span>{L_CONTACT_US}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
219
public/styles/prosilver/template/navbar_header.html
Normal file
219
public/styles/prosilver/template/navbar_header.html
Normal file
|
@ -0,0 +1,219 @@
|
|||
<div class="navbar" role="navigation">
|
||||
<div class="inner">
|
||||
|
||||
<ul id="nav-main" class="nav-main linklist" role="menubar">
|
||||
|
||||
<li id="quick-links" class="quick-links dropdown-container responsive-menu<!-- IF not S_DISPLAY_QUICK_LINKS and not S_DISPLAY_SEARCH --> hidden<!-- ENDIF -->" data-skip-responsive="true">
|
||||
<a href="#" class="dropdown-trigger">
|
||||
<i class="icon fa-bars fa-fw" aria-hidden="true"></i><span>{L_QUICK_LINKS}</span>
|
||||
</a>
|
||||
<div class="dropdown">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<ul class="dropdown-contents" role="menu">
|
||||
<!-- EVENT navbar_header_quick_links_before -->
|
||||
|
||||
<!-- IF S_DISPLAY_SEARCH -->
|
||||
<li class="separator"></li>
|
||||
<!-- IF S_REGISTERED_USER -->
|
||||
<li>
|
||||
<a href="{U_SEARCH_SELF}" role="menuitem">
|
||||
<i class="icon fa-file-o fa-fw icon-gray" aria-hidden="true"></i><span>{L_SEARCH_SELF}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_USER_LOGGED_IN -->
|
||||
<li>
|
||||
<a href="{U_SEARCH_NEW}" role="menuitem">
|
||||
<i class="icon fa-file-o fa-fw icon-red" aria-hidden="true"></i><span>{L_SEARCH_NEW}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_LOAD_UNREADS -->
|
||||
<li>
|
||||
<a href="{U_SEARCH_UNREAD}" role="menuitem">
|
||||
<i class="icon fa-file-o fa-fw icon-red" aria-hidden="true"></i><span>{L_SEARCH_UNREAD}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<li>
|
||||
<a href="{U_SEARCH_UNANSWERED}" role="menuitem">
|
||||
<i class="icon fa-file-o fa-fw icon-gray" aria-hidden="true"></i><span>{L_SEARCH_UNANSWERED}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="{U_SEARCH_ACTIVE_TOPICS}" role="menuitem">
|
||||
<i class="icon fa-file-o fa-fw icon-blue" aria-hidden="true"></i><span>{L_SEARCH_ACTIVE_TOPICS}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="separator"></li>
|
||||
<li>
|
||||
<a href="{U_SEARCH}" role="menuitem">
|
||||
<i class="icon fa-search fa-fw" aria-hidden="true"></i><span>{L_SEARCH}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_IS_BOT and (S_DISPLAY_MEMBERLIST or U_TEAM) -->
|
||||
<li class="separator"></li>
|
||||
<!-- IF S_DISPLAY_MEMBERLIST -->
|
||||
<li>
|
||||
<a href="{U_MEMBERLIST}" role="menuitem">
|
||||
<i class="icon fa-group fa-fw" aria-hidden="true"></i><span>{L_MEMBERLIST}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF U_TEAM -->
|
||||
<li>
|
||||
<a href="{U_TEAM}" role="menuitem">
|
||||
<i class="icon fa-shield fa-fw" aria-hidden="true"></i><span>{L_THE_TEAM}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
<li class="separator"></li>
|
||||
|
||||
<!-- EVENT navbar_header_quick_links_after -->
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<!-- EVENT overall_header_navigation_prepend -->
|
||||
<li <!-- IF not S_USER_LOGGED_IN -->data-skip-responsive="true"<!-- ELSE -->data-last-responsive="true"<!-- ENDIF -->>
|
||||
<a href="{U_FAQ}" rel="help" title="{L_FAQ_EXPLAIN}" role="menuitem">
|
||||
<i class="icon fa-question-circle fa-fw" aria-hidden="true"></i><span>{L_FAQ}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- EVENT overall_header_navigation_append -->
|
||||
<!-- IF U_ACP -->
|
||||
<li data-last-responsive="true">
|
||||
<a href="{U_ACP}" title="{L_ACP}" role="menuitem">
|
||||
<i class="icon fa-cogs fa-fw" aria-hidden="true"></i><span>{L_ACP_SHORT}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF U_MCP -->
|
||||
<li data-last-responsive="true">
|
||||
<a href="{U_MCP}" title="{L_MCP}" role="menuitem">
|
||||
<i class="icon fa-gavel fa-fw" aria-hidden="true"></i><span>{L_MCP_SHORT}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_REGISTERED_USER -->
|
||||
<!-- EVENT navbar_header_user_profile_prepend -->
|
||||
<li id="username_logged_in" class="rightside <!-- IF CURRENT_USER_AVATAR --> no-bulletin<!-- ENDIF -->" data-skip-responsive="true">
|
||||
<!-- EVENT navbar_header_username_prepend -->
|
||||
<div class="header-profile dropdown-container">
|
||||
<a href="{U_PROFILE}" class="header-avatar dropdown-trigger"><!-- IF CURRENT_USER_AVATAR -->{CURRENT_USER_AVATAR} <!-- ENDIF --> {CURRENT_USERNAME_SIMPLE}</a>
|
||||
<div class="dropdown">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<ul class="dropdown-contents" role="menu">
|
||||
<!-- IF U_RESTORE_PERMISSIONS -->
|
||||
<li>
|
||||
<a href="{U_RESTORE_PERMISSIONS}">
|
||||
<i class="icon fa-refresh fa-fw" aria-hidden="true"></i><span>{L_RESTORE_PERMISSIONS}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT navbar_header_profile_list_before -->
|
||||
|
||||
<li>
|
||||
<a href="{U_PROFILE}" title="{L_PROFILE}" role="menuitem">
|
||||
<i class="icon fa-sliders fa-fw" aria-hidden="true"></i><span>{L_PROFILE}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- IF U_USER_PROFILE -->
|
||||
<li>
|
||||
<a href="{U_USER_PROFILE}" title="{L_READ_PROFILE}" role="menuitem">
|
||||
<i class="icon fa-user fa-fw" aria-hidden="true"></i><span>{L_READ_PROFILE}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT navbar_header_profile_list_after -->
|
||||
|
||||
<li class="separator"></li>
|
||||
<li>
|
||||
<a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">
|
||||
<i class="icon fa-power-off fa-fw" aria-hidden="true"></i><span>{L_LOGIN_LOGOUT}</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<!-- EVENT navbar_header_username_append -->
|
||||
</li>
|
||||
<!-- IF S_DISPLAY_PM -->
|
||||
<li class="rightside" data-skip-responsive="true">
|
||||
<a href="{U_PRIVATEMSGS}" role="menuitem">
|
||||
<i class="icon fa-inbox fa-fw" aria-hidden="true"></i><span>{L_PRIVATE_MESSAGES} </span><strong class="badge<!-- IF not PRIVATE_MESSAGE_COUNT --> hidden<!-- ENDIF -->">{PRIVATE_MESSAGE_COUNT}</strong>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_NOTIFICATIONS_DISPLAY -->
|
||||
<li class="dropdown-container dropdown-{S_CONTENT_FLOW_END} rightside" data-skip-responsive="true">
|
||||
<a href="{U_VIEW_ALL_NOTIFICATIONS}" id="notification_list_button" class="dropdown-trigger">
|
||||
<i class="icon fa-bell fa-fw" aria-hidden="true"></i><span>{L_NOTIFICATIONS} </span><strong class="badge<!-- IF not NOTIFICATIONS_COUNT --> hidden<!-- ENDIF -->">{NOTIFICATIONS_COUNT}</strong>
|
||||
</a>
|
||||
<!-- INCLUDE notification_dropdown.html -->
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT navbar_header_user_profile_append -->
|
||||
<!-- ELSE IF not S_IS_BOT -->
|
||||
<li class="rightside" data-skip-responsive="true">
|
||||
<a href="{U_LOGIN_LOGOUT}" title="{L_LOGIN_LOGOUT}" accesskey="x" role="menuitem">
|
||||
<i class="icon fa-power-off fa-fw" aria-hidden="true"></i><span>{L_LOGIN_LOGOUT}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- IF S_REGISTER_ENABLED and not (S_SHOW_COPPA or S_REGISTRATION) -->
|
||||
<li class="rightside" data-skip-responsive="true">
|
||||
<a href="{U_REGISTER}" role="menuitem">
|
||||
<i class="icon fa-pencil-square-o fa-fw" aria-hidden="true"></i><span>{L_REGISTER}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT navbar_header_logged_out_content -->
|
||||
<!-- ENDIF -->
|
||||
</ul>
|
||||
|
||||
<ul id="nav-breadcrumbs" class="nav-breadcrumbs linklist navlinks" role="menubar">
|
||||
{% set MICRODATA = 'itemtype="https://schema.org/ListItem" itemprop="itemListElement" itemscope' %}
|
||||
{% set navlink_position = 1 %}
|
||||
|
||||
{% EVENT overall_header_breadcrumbs_before %}
|
||||
|
||||
<li class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList">
|
||||
|
||||
{% if U_SITE_HOME %}
|
||||
<span class="crumb" {{ MICRODATA }}><a itemprop="item" href="{{ U_SITE_HOME }}" data-navbar-reference="home"><i class="icon fa-home fa-fw" aria-hidden="true"></i><span itemprop="name">{{ L_SITE_HOME }}</span></a><meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}" /></span>
|
||||
{% endif %}
|
||||
|
||||
{% EVENT overall_header_breadcrumb_prepend %}
|
||||
<span class="crumb" {{ MICRODATA }}><a itemprop="item" href="{{ U_INDEX }}" accesskey="h" data-navbar-reference="index">{% if not U_SITE_HOME %}<i class="icon fa-home fa-fw"></i>{% endif %}<span itemprop="name">{{ L_INDEX }}</span></a><meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}" /></span>
|
||||
|
||||
{% for navlink in navlinks %}
|
||||
{% set NAVLINK_NAME = navlink.BREADCRUMB_NAME | default(navlink.FORUM_NAME) %}
|
||||
{% set NAVLINK_LINK = navlink.U_BREADCRUMB | default(navlink.U_VIEW_FORUM) %}
|
||||
|
||||
{% EVENT overall_header_navlink_prepend %}
|
||||
<span class="crumb" {{ MICRODATA }}{% if navlink.MICRODATA %} {{ navlink.MICRODATA }}{% endif %}><a itemprop="item" href="{{ NAVLINK_LINK }}"><span itemprop="name">{{ NAVLINK_NAME }}</span></a><meta itemprop="position" content="{{ navlink_position }}{% set navlink_position = navlink_position + 1 %}" /></span>
|
||||
{% EVENT overall_header_navlink_append %}
|
||||
{% endfor %}
|
||||
|
||||
{% EVENT overall_header_breadcrumb_append %}
|
||||
</li>
|
||||
|
||||
{% EVENT overall_header_breadcrumbs_after %}
|
||||
|
||||
{% if S_DISPLAY_SEARCH and not S_IN_SEARCH %}
|
||||
<li class="rightside responsive-search">
|
||||
<a href="{{ U_SEARCH }}" title="{{ lang('SEARCH_ADV_EXPLAIN') }}" role="menuitem">
|
||||
<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{{ lang('SEARCH') }}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
</div>
|
47
public/styles/prosilver/template/notification_dropdown.html
Normal file
47
public/styles/prosilver/template/notification_dropdown.html
Normal file
|
@ -0,0 +1,47 @@
|
|||
<div id="notification_list" class="dropdown dropdown-extended notification_list">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<div class="dropdown-contents">
|
||||
<div class="header">
|
||||
{L_NOTIFICATIONS}
|
||||
<span class="header_settings">
|
||||
<a href="{U_NOTIFICATION_SETTINGS}">{L_SETTINGS}</a>
|
||||
<!-- IF NOTIFICATIONS_COUNT -->
|
||||
<span id="mark_all_notifications"> • <a href="{U_MARK_ALL_NOTIFICATIONS}" data-ajax="notification.mark_all_read">{L_MARK_ALL_READ}</a></span>
|
||||
<!-- ENDIF -->
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<ul>
|
||||
<!-- IF not .notifications -->
|
||||
<li class="no_notifications">
|
||||
{L_NO_NOTIFICATIONS}
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- BEGIN notifications -->
|
||||
<li class="<!-- IF notifications.UNREAD --> bg2<!-- ENDIF --><!-- IF notifications.STYLING --> {notifications.STYLING}<!-- ENDIF --><!-- IF not notifications.URL --> no-url<!-- ENDIF -->">
|
||||
<!-- IF notifications.URL -->
|
||||
<a class="notification-block" href="<!-- IF notifications.UNREAD -->{notifications.U_MARK_READ}" data-real-url="{notifications.URL}<!-- ELSE -->{notifications.URL}<!-- ENDIF -->">
|
||||
<!-- ENDIF -->
|
||||
<!-- IF notifications.AVATAR -->{notifications.AVATAR}<!-- ELSE --><img src="{T_THEME_PATH}/images/no_avatar.gif" alt="" /><!-- ENDIF -->
|
||||
<div class="notification_text">
|
||||
<p class="notification-title">{notifications.FORMATTED_TITLE}</p>
|
||||
<!-- IF notifications.REFERENCE --><p class="notification-reference">{notifications.REFERENCE}</p><!-- ENDIF -->
|
||||
<!-- IF notifications.FORUM --><p class="notification-forum">{notifications.FORUM}</p><!-- ENDIF -->
|
||||
<!-- IF notifications.REASON --><p class="notification-reason">{notifications.REASON}</p><!-- ENDIF -->
|
||||
<p class="notification-time">{notifications.TIME}</p>
|
||||
</div>
|
||||
<!-- IF notifications.URL --></a><!-- ENDIF -->
|
||||
<!-- IF notifications.UNREAD -->
|
||||
<a href="{notifications.U_MARK_READ}" class="mark_read icon-mark" data-ajax="notification.mark_read" title="{L_MARK_READ}">
|
||||
<i class="icon fa-check-circle icon-xl fa-fw" aria-hidden="true"></i><span class="sr-only">{L_MARK_READ}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
</li>
|
||||
<!-- END notifications -->
|
||||
</ul>
|
||||
|
||||
<div class="footer">
|
||||
<a href="{U_VIEW_ALL_NOTIFICATIONS}"><span>{L_SEE_ALL}</span></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
120
public/styles/prosilver/template/overall_footer.html
Normal file
120
public/styles/prosilver/template/overall_footer.html
Normal file
|
@ -0,0 +1,120 @@
|
|||
<!-- EVENT overall_footer_content_after -->
|
||||
</div>
|
||||
|
||||
<!-- EVENT overall_footer_page_body_after -->
|
||||
|
||||
<div id="page-footer" class="page-footer" role="contentinfo">
|
||||
<!-- INCLUDE navbar_footer.html -->
|
||||
|
||||
<div class="copyright">
|
||||
<!-- EVENT overall_footer_copyright_prepend -->
|
||||
<p class="footer-row">
|
||||
<span class="footer-copyright">{{ CREDIT_LINE }}</span>
|
||||
</p>
|
||||
<!-- IF TRANSLATION_INFO -->
|
||||
<p class="footer-row">
|
||||
<span class="footer-copyright">{{ TRANSLATION_INFO }}</span>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT overall_footer_copyright_append -->
|
||||
<p class="footer-row" role="menu">
|
||||
<a class="footer-link" href="{{ U_PRIVACY }}" title="{{ lang('PRIVACY_LINK') }}" role="menuitem">
|
||||
<span class="footer-link-text">{{ lang('PRIVACY_LINK') }}</span>
|
||||
</a>
|
||||
|
|
||||
<a class="footer-link" href="{{ U_TERMS_USE }}" title="{{ lang('TERMS_LINK') }}" role="menuitem">
|
||||
<span class="footer-link-text">{{ lang('TERMS_LINK') }}</span>
|
||||
</a>
|
||||
</p>
|
||||
<!-- IF DEBUG_OUTPUT -->
|
||||
<p class="footer-row">
|
||||
<span class="footer-info">{{ DEBUG_OUTPUT }}</span>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF U_ACP -->
|
||||
<p class="footer-row">
|
||||
<a class="footer-link text-strong" href="{{ U_ACP }}">{{ lang('ACP') }}</a>
|
||||
</p>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
<div id="darkenwrapper" class="darkenwrapper" data-ajax-error-title="{L_AJAX_ERROR_TITLE}" data-ajax-error-text="{L_AJAX_ERROR_TEXT}" data-ajax-error-text-abort="{L_AJAX_ERROR_TEXT_ABORT}" data-ajax-error-text-timeout="{L_AJAX_ERROR_TEXT_TIMEOUT}" data-ajax-error-text-parsererror="{L_AJAX_ERROR_TEXT_PARSERERROR}">
|
||||
<div id="darken" class="darken"> </div>
|
||||
</div>
|
||||
|
||||
<div id="phpbb_alert" class="phpbb_alert" data-l-err="{L_ERROR}" data-l-timeout-processing-req="{L_TIMEOUT_PROCESSING_REQ}">
|
||||
<a href="#" class="alert_close">
|
||||
<i class="icon fa-times-circle fa-fw" aria-hidden="true"></i>
|
||||
</a>
|
||||
<h3 class="alert_title"> </h3><p class="alert_text"></p>
|
||||
</div>
|
||||
<div id="phpbb_confirm" class="phpbb_alert">
|
||||
<a href="#" class="alert_close">
|
||||
<i class="icon fa-times-circle fa-fw" aria-hidden="true"></i>
|
||||
</a>
|
||||
<div class="alert_text"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a id="bottom" class="anchor" accesskey="z"></a>
|
||||
<!-- IF not S_IS_BOT -->{RUN_CRON_TASK}<!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
<script src="{T_JQUERY_LINK}"></script>
|
||||
<!-- IF S_ALLOW_CDN --><script>window.jQuery || document.write('\x3Cscript src="{T_ASSETS_PATH}/javascript/jquery-3.5.1.min.js?assets_version={T_ASSETS_VERSION}">\x3C/script>');</script><!-- ENDIF -->
|
||||
<script src="{T_ASSETS_PATH}/javascript/core.js?assets_version={T_ASSETS_VERSION}"></script>
|
||||
<!-- INCLUDEJS forum_fn.js -->
|
||||
<!-- INCLUDEJS ajax.js -->
|
||||
<!-- IF S_ALLOW_CDN -->
|
||||
<script>
|
||||
(function($){
|
||||
var $fa_cdn = $('head').find('link[rel="stylesheet"]').first(),
|
||||
$span = $('<span class="fa" style="display:none"></span>').appendTo('body');
|
||||
if ($span.css('fontFamily') !== 'FontAwesome' ) {
|
||||
$fa_cdn.after('<link href="{T_ASSETS_PATH}/css/font-awesome.min.css" rel="stylesheet">');
|
||||
$fa_cdn.remove();
|
||||
}
|
||||
$span.remove();
|
||||
})(jQuery);
|
||||
</script>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_COOKIE_NOTICE -->
|
||||
<script src="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.js?assets_version={T_ASSETS_VERSION}"></script>
|
||||
<script>
|
||||
if (typeof window.cookieconsent === "object") {
|
||||
window.addEventListener("load", function(){
|
||||
window.cookieconsent.initialise({
|
||||
"palette": {
|
||||
"popup": {
|
||||
"background": "#0F538A"
|
||||
},
|
||||
"button": {
|
||||
"background": "#E5E5E5"
|
||||
}
|
||||
},
|
||||
"theme": "classic",
|
||||
"content": {
|
||||
"message": "{LA_COOKIE_CONSENT_MSG}",
|
||||
"dismiss": "{LA_COOKIE_CONSENT_OK}",
|
||||
"link": "{LA_COOKIE_CONSENT_INFO}",
|
||||
"href": "{UA_PRIVACY}"
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT overall_footer_after -->
|
||||
|
||||
<!-- IF S_PLUPLOAD --><!-- INCLUDE plupload.html --><!-- ENDIF -->
|
||||
{$SCRIPTS}
|
||||
|
||||
<!-- EVENT overall_footer_body_after -->
|
||||
|
||||
</body>
|
||||
</html>
|
133
public/styles/prosilver/template/overall_header.html
Normal file
133
public/styles/prosilver/template/overall_header.html
Normal file
|
@ -0,0 +1,133 @@
|
|||
<!DOCTYPE html>
|
||||
<html dir="{S_CONTENT_DIRECTION}" lang="{S_USER_LANG}">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
{META}
|
||||
<title><!-- IF UNREAD_NOTIFICATIONS_COUNT -->({UNREAD_NOTIFICATIONS_COUNT}) <!-- ENDIF --><!-- IF not S_VIEWTOPIC and not S_VIEWFORUM -->{SITENAME} - <!-- ENDIF --><!-- IF S_IN_MCP -->{L_MCP} - <!-- ELSEIF S_IN_UCP -->{L_UCP} - <!-- ENDIF -->{PAGE_TITLE}<!-- IF S_VIEWTOPIC or S_VIEWFORUM --> - {SITENAME}<!-- ENDIF --></title>
|
||||
|
||||
<!-- IF S_ENABLE_FEEDS -->
|
||||
<!-- IF S_ENABLE_FEEDS_OVERALL --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {SITENAME}" href="{{ path('phpbb_feed_index') }}"><!-- ENDIF -->
|
||||
<!-- IF S_ENABLE_FEEDS_NEWS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_NEWS}" href="{{ path('phpbb_feed_news') }}"><!-- ENDIF -->
|
||||
<!-- IF S_ENABLE_FEEDS_FORUMS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_ALL_FORUMS}" href="{{ path('phpbb_feed_forums') }}"><!-- ENDIF -->
|
||||
<!-- IF S_ENABLE_FEEDS_TOPICS --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_NEW}" href="{{ path('phpbb_feed_topics') }}"><!-- ENDIF -->
|
||||
<!-- IF S_ENABLE_FEEDS_TOPICS_ACTIVE --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FEED_TOPICS_ACTIVE}" href="{{ path('phpbb_feed_topics_active') }}"><!-- ENDIF -->
|
||||
<!-- IF S_ENABLE_FEEDS_FORUM and S_FORUM_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_FORUM} - {FORUM_NAME}" href="{{ path('phpbb_feed_forum', { forum_id : S_FORUM_ID } ) }}"><!-- ENDIF -->
|
||||
<!-- IF S_ENABLE_FEEDS_TOPIC and S_TOPIC_ID --><link rel="alternate" type="application/atom+xml" title="{L_FEED} - {L_TOPIC} - {TOPIC_TITLE}" href="{{ path('phpbb_feed_topic', { topic_id : S_TOPIC_ID } ) }}"><!-- ENDIF -->
|
||||
<!-- EVENT overall_header_feeds -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF U_CANONICAL -->
|
||||
<link rel="canonical" href="{U_CANONICAL}">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!--
|
||||
phpBB style name: prosilver
|
||||
Based on style: prosilver (this is the default phpBB3 style)
|
||||
Original author: Tom Beddard ( http://www.subBlue.com/ )
|
||||
Modified by:
|
||||
-->
|
||||
|
||||
<!-- IF S_ALLOW_CDN -->
|
||||
<script>
|
||||
WebFontConfig = {
|
||||
google: {
|
||||
families: ['Open+Sans:300,300i,400,400i,600,600i,700,700i,800,800i&subset=cyrillic,cyrillic-ext,greek,greek-ext,latin-ext,vietnamese']
|
||||
}
|
||||
};
|
||||
|
||||
(function(d) {
|
||||
var wf = d.createElement('script'), s = d.scripts[0];
|
||||
wf.src = 'https://ajax.googleapis.com/ajax/libs/webfont/1.5.18/webfont.js';
|
||||
wf.async = true;
|
||||
s.parentNode.insertBefore(wf, s);
|
||||
})(document);
|
||||
</script>
|
||||
<!-- ENDIF -->
|
||||
<link href="{T_FONT_AWESOME_LINK}" rel="stylesheet">
|
||||
<link href="{T_STYLESHEET_LINK}" rel="stylesheet">
|
||||
<link href="{T_STYLESHEET_LANG_LINK}" rel="stylesheet">
|
||||
|
||||
<!-- IF S_CONTENT_DIRECTION eq 'rtl' -->
|
||||
<link href="{T_THEME_PATH}/bidi.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_PLUPLOAD -->
|
||||
<link href="{T_THEME_PATH}/plupload.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_COOKIE_NOTICE -->
|
||||
<link href="{T_ASSETS_PATH}/cookieconsent/cookieconsent.min.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!--[if lte IE 9]>
|
||||
<link href="{T_THEME_PATH}/tweaks.css?assets_version={T_ASSETS_VERSION}" rel="stylesheet">
|
||||
<![endif]-->
|
||||
|
||||
<!-- EVENT overall_header_head_append -->
|
||||
|
||||
{$STYLESHEETS}
|
||||
|
||||
<!-- EVENT overall_header_stylesheets_after -->
|
||||
|
||||
</head>
|
||||
<body id="phpbb" class="nojs notouch section-{SCRIPT_NAME} {S_CONTENT_DIRECTION} {BODY_CLASS}">
|
||||
|
||||
<!-- EVENT overall_header_body_before -->
|
||||
|
||||
<div id="wrap" class="wrap">
|
||||
<a id="top" class="top-anchor" accesskey="t"></a>
|
||||
<div id="page-header">
|
||||
<div class="headerbar" role="banner">
|
||||
<!-- EVENT overall_header_headerbar_before -->
|
||||
<div class="inner">
|
||||
|
||||
<div id="site-description" class="site-description">
|
||||
<a id="logo" class="logo" href="{% if U_SITE_HOME %}{{ U_SITE_HOME }}{% else %}{{ U_INDEX }}{% endif %}" title="{% if U_SITE_HOME %}{{ L_SITE_HOME }}{% else %}{{ L_INDEX }}{% endif %}">
|
||||
<span class="site_logo"></span>
|
||||
</a>
|
||||
<h1>{SITENAME}</h1>
|
||||
<p>{SITE_DESCRIPTION}</p>
|
||||
<p class="skiplink"><a href="#start_here">{L_SKIP}</a></p>
|
||||
</div>
|
||||
|
||||
<!-- EVENT overall_header_searchbox_before -->
|
||||
<!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH -->
|
||||
<div id="search-box" class="search-box search-header" role="search">
|
||||
<form action="{U_SEARCH}" method="get" id="search">
|
||||
<fieldset>
|
||||
<input name="keywords" id="keywords" type="search" maxlength="128" title="{L_SEARCH_KEYWORDS}" class="inputbox search tiny" size="20" value="{SEARCH_WORDS}" placeholder="{L_SEARCH_MINI}" />
|
||||
<button class="button button-search" type="submit" title="{L_SEARCH}">
|
||||
<i class="icon fa-search fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH}</span>
|
||||
</button>
|
||||
<a href="{U_SEARCH}" class="button button-search-end" title="{L_SEARCH_ADV}">
|
||||
<i class="icon fa-cog fa-fw" aria-hidden="true"></i><span class="sr-only">{L_SEARCH_ADV}</span>
|
||||
</a>
|
||||
{S_SEARCH_HIDDEN_FIELDS}
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT overall_header_searchbox_after -->
|
||||
|
||||
</div>
|
||||
<!-- EVENT overall_header_headerbar_after -->
|
||||
</div>
|
||||
<!-- EVENT overall_header_navbar_before -->
|
||||
<!-- INCLUDE navbar_header.html -->
|
||||
</div>
|
||||
|
||||
<!-- EVENT overall_header_page_body_before -->
|
||||
|
||||
<a id="start_here" class="anchor"></a>
|
||||
<div id="page-body" class="page-body" role="main">
|
||||
<!-- IF S_BOARD_DISABLED and S_USER_LOGGED_IN and (U_MCP or U_ACP) -->
|
||||
<div id="information" class="rules">
|
||||
<div class="inner">
|
||||
<strong>{L_INFORMATION}{L_COLON}</strong> {L_BOARD_DISABLED}
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT overall_header_content_before -->
|
30
public/styles/prosilver/template/pagination.html
Normal file
30
public/styles/prosilver/template/pagination.html
Normal file
|
@ -0,0 +1,30 @@
|
|||
<ul>
|
||||
<!-- IF BASE_URL and TOTAL_PAGES > 6 -->
|
||||
<li class="dropdown-container dropdown-button-control dropdown-page-jump page-jump">
|
||||
<a class="button button-icon-only dropdown-trigger" href="#" title="{L_JUMP_TO_PAGE_CLICK}" role="button"><i class="icon fa-level-down fa-rotate-270" aria-hidden="true"></i><span class="sr-only">{PAGE_NUMBER}</span></a>
|
||||
<div class="dropdown">
|
||||
<div class="pointer"><div class="pointer-inner"></div></div>
|
||||
<ul class="dropdown-contents">
|
||||
<li>{L_JUMP_TO_PAGE}{L_COLON}</li>
|
||||
<li class="page-jump-form">
|
||||
<input type="number" name="page-number" min="1" max="999999" title="{L_JUMP_PAGE}" class="inputbox tiny" data-per-page="{PER_PAGE}" data-base-url="{BASE_URL|e('html_attr')}" data-start-name="{START_NAME}" />
|
||||
<input class="button2" value="{L_GO}" type="button" />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- BEGIN pagination -->
|
||||
<!-- IF pagination.S_IS_PREV -->
|
||||
<li class="arrow previous"><a class="button button-icon-only" href="{pagination.PAGE_URL}" rel="prev" role="button"><i class="icon fa-chevron-{S_CONTENT_FLOW_BEGIN} fa-fw" aria-hidden="true"></i><span class="sr-only">{L_PREVIOUS}</span></a></li>
|
||||
<!-- ELSEIF pagination.S_IS_CURRENT -->
|
||||
<li class="active"><span>{pagination.PAGE_NUMBER}</span></li>
|
||||
<!-- ELSEIF pagination.S_IS_ELLIPSIS -->
|
||||
<li class="ellipsis" role="separator"><span>{L_ELLIPSIS}</span></li>
|
||||
<!-- ELSEIF pagination.S_IS_NEXT -->
|
||||
<li class="arrow next"><a class="button button-icon-only" href="{pagination.PAGE_URL}" rel="next" role="button"><i class="icon fa-chevron-{S_CONTENT_FLOW_END} fa-fw" aria-hidden="true"></i><span class="sr-only">{L_NEXT}</span></a></li>
|
||||
<!-- ELSE -->
|
||||
<li><a class="button" href="{pagination.PAGE_URL}" role="button">{pagination.PAGE_NUMBER}</a></li>
|
||||
<!-- ENDIF -->
|
||||
<!-- END pagination -->
|
||||
</ul>
|
75
public/styles/prosilver/template/plupload.html
Normal file
75
public/styles/prosilver/template/plupload.html
Normal file
|
@ -0,0 +1,75 @@
|
|||
<script>
|
||||
phpbb.plupload = {
|
||||
i18n: {
|
||||
'b': '{LA_BYTES_SHORT}',
|
||||
'kb': '{LA_KB}',
|
||||
'mb': '{LA_MB}',
|
||||
'gb': '{LA_GB}',
|
||||
'tb': '{LA_TB}',
|
||||
'Add Files': '{LA_PLUPLOAD_ADD_FILES}',
|
||||
'Add files to the upload queue and click the start button.': '{LA_PLUPLOAD_ADD_FILES_TO_QUEUE}',
|
||||
'Close': '{LA_PLUPLOAD_CLOSE}',
|
||||
'Drag files here.': '{LA_PLUPLOAD_DRAG}',
|
||||
'Duplicate file error.': '{LA_PLUPLOAD_DUPLICATE_ERROR}',
|
||||
'File: %s': '{LA_PLUPLOAD_FILE}',
|
||||
'File: %s, size: %d, max file size: %d': '{LA_PLUPLOAD_FILE_DETAILS}',
|
||||
'File count error.': '{LA_PLUPLOAD_ERR_FILE_COUNT}',
|
||||
'File extension error.': '{LA_PLUPLOAD_EXTENSION_ERROR}',
|
||||
'File size error.': '{LA_PLUPLOAD_SIZE_ERROR}',
|
||||
'File too large:': '{LA_PLUPLOAD_ERR_FILE_TOO_LARGE}',
|
||||
'Filename': '{LA_PLUPLOAD_FILENAME}',
|
||||
'Generic error.': '{LA_PLUPLOAD_GENERIC_ERROR}',
|
||||
'HTTP Error.': '{LA_PLUPLOAD_HTTP_ERROR}',
|
||||
'Image format either wrong or not supported.': '{LA_PLUPLOAD_IMAGE_FORMAT}',
|
||||
'Init error.': '{LA_PLUPLOAD_INIT_ERROR}',
|
||||
'IO error.': '{LA_PLUPLOAD_IO_ERROR}',
|
||||
'Invalid file extension:': '{LA_PLUPLOAD_ERR_FILE_INVALID_EXT}',
|
||||
'N/A': '{LA_PLUPLOAD_NOT_APPLICABLE}',
|
||||
'Runtime ran out of available memory.': '{LA_PLUPLOAD_ERR_RUNTIME_MEMORY}',
|
||||
'Security error.': '{LA_PLUPLOAD_SECURITY_ERROR}',
|
||||
'Select files': '{LA_PLUPLOAD_SELECT_FILES}',
|
||||
'Size': '{LA_PLUPLOAD_SIZE}',
|
||||
'Start Upload': '{LA_PLUPLOAD_START_UPLOAD}',
|
||||
'Start uploading queue': '{LA_PLUPLOAD_START_CURRENT_UPLOAD}',
|
||||
'Status': '{LA_PLUPLOAD_STATUS}',
|
||||
'Stop Upload': '{LA_PLUPLOAD_STOP_UPLOAD}',
|
||||
'Stop current upload': '{LA_PLUPLOAD_STOP_CURRENT_UPLOAD}',
|
||||
"Upload URL might be wrong or doesn't exist.": '{LA_PLUPLOAD_ERR_UPLOAD_URL}',
|
||||
'Uploaded %d/%d files': '{LA_PLUPLOAD_UPLOADED}',
|
||||
'%d files queued': '{LA_PLUPLOAD_FILES_QUEUED}',
|
||||
'%s already present in the queue.': '{LA_PLUPLOAD_ALREADY_QUEUED}'
|
||||
},
|
||||
config: {
|
||||
runtimes: 'html5',
|
||||
url: '{S_PLUPLOAD_URL}',
|
||||
max_file_size: '{FILESIZE}b',
|
||||
chunk_size: '{CHUNK_SIZE}b',
|
||||
unique_names: true,
|
||||
filters: {
|
||||
mime_types: [
|
||||
{FILTERS}
|
||||
],
|
||||
mime_types_max_file_size: [
|
||||
{FILTERS}
|
||||
],
|
||||
},
|
||||
{S_RESIZE}
|
||||
headers: {'X-PHPBB-USING-PLUPLOAD': '1', 'X-Requested-With': 'XMLHttpRequest'},
|
||||
file_data_name: 'fileupload',
|
||||
multipart_params: {'add_file': '{LA_ADD_FILE}'},
|
||||
form_hook: '#postform',
|
||||
browse_button: 'add_files',
|
||||
drop_element : 'message',
|
||||
},
|
||||
lang: {
|
||||
ERROR: '{LA_ERROR}',
|
||||
TOO_MANY_ATTACHMENTS: '{LA_TOO_MANY_ATTACHMENTS}',
|
||||
FORM_INVALID: '{LA_FORM_INVALID}',
|
||||
},
|
||||
order: '{ATTACH_ORDER}',
|
||||
maxFiles: {MAX_ATTACHMENTS},
|
||||
data: {S_ATTACH_DATA},
|
||||
}
|
||||
</script>
|
||||
<!-- INCLUDEJS {T_ASSETS_PATH}/plupload/plupload.full.min.js -->
|
||||
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/plupload.js -->
|
94
public/styles/prosilver/template/posting_attach_body.html
Normal file
94
public/styles/prosilver/template/posting_attach_body.html
Normal file
|
@ -0,0 +1,94 @@
|
|||
<div class="panel bg3 panel-container" id="attach-panel">
|
||||
<div class="inner">
|
||||
|
||||
<p>{L_ADD_ATTACHMENT_EXPLAIN} <span class="hidden" id="drag-n-drop-message">{L_PLUPLOAD_DRAG_TEXTAREA}</span></p>
|
||||
{% if MAX_ATTACHMENT_FILESIZE is not empty %}<p>{{ MAX_ATTACHMENT_FILESIZE }}</p>{% endif %}
|
||||
|
||||
<fieldset class="fields2" id="attach-panel-basic">
|
||||
<dl>
|
||||
<dt><label for="fileupload">{L_FILENAME}{L_COLON}</label></dt>
|
||||
<dd>
|
||||
<input type="file" name="fileupload" id="fileupload" class="inputbox autowidth" />
|
||||
<input type="submit" name="add_file" value="{L_ADD_FILE}" class="button2" onclick="upload = true;" />
|
||||
</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="filecomment">{L_FILE_COMMENT}{L_COLON}</label></dt>
|
||||
<dd><textarea name="filecomment" id="filecomment" rows="1" cols="40" class="inputbox autowidth">{FILE_COMMENT}</textarea></dd>
|
||||
</dl>
|
||||
</fieldset>
|
||||
|
||||
<div id="attach-panel-multi" class="attach-panel-multi">
|
||||
<input type="button" class="button2" value="{L_PLUPLOAD_ADD_FILES}" id="add_files" />
|
||||
</div>
|
||||
|
||||
{% EVENT posting_attach_body_file_list_before %}
|
||||
<div class="panel<!-- IF not .attach_row --> hidden<!-- ENDIF --> file-list-container" id="file-list-container">
|
||||
<div class="inner">
|
||||
<table class="table1 zebra-list fixed-width-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="attach-name">{L_PLUPLOAD_FILENAME}</th>
|
||||
<th class="attach-comment">{L_FILE_COMMENT}</th>
|
||||
<th class="attach-filesize">{L_PLUPLOAD_SIZE}</th>
|
||||
<th class="attach-status">{L_PLUPLOAD_STATUS}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="responsive-skip-empty file-list" id="file-list">
|
||||
<tr class="attach-row attach-row-tpl" id="attach-row-tpl">
|
||||
<td class="attach-name">
|
||||
<span class="file-name ellipsis-text"></span>
|
||||
<span class="attach-controls">
|
||||
{% if S_BBCODE_ALLOWED %}<input type="button" value="{{ lang('PLACE_INLINE') }}" class="button2 hidden file-inline-bbcode" /> {% endif %}
|
||||
<input type="button" value="{L_DELETE_FILE}" class="button2 file-delete" />
|
||||
</span>
|
||||
<span class="clear"></span>
|
||||
</td>
|
||||
<td class="attach-comment">
|
||||
<textarea rows="1" cols="30" class="inputbox"></textarea>
|
||||
</td>
|
||||
<td class="attach-filesize">
|
||||
<span class="file-size"></span>
|
||||
</td>
|
||||
<td class="attach-status">
|
||||
<span class="file-progress">
|
||||
<span class="file-progress-bar"></span>
|
||||
</span>
|
||||
<span class="file-status"></span>
|
||||
</td>
|
||||
</tr>
|
||||
{% EVENT posting_attach_body_attach_row_before %}
|
||||
<!-- BEGIN attach_row -->
|
||||
{% EVENT posting_attach_body_attach_row_prepend %}
|
||||
<tr class="attach-row" data-attach-id="{attach_row.ATTACH_ID}">
|
||||
<td class="attach-name">
|
||||
<span class="file-name ellipsis-text"><a href="{attach_row.U_VIEW_ATTACHMENT}">{attach_row.FILENAME}</a></span>
|
||||
{% EVENT posting_attach_body_attach_row_controls_prepend %}
|
||||
<span class="attach-controls">
|
||||
{% if S_BBCODE_ALLOWED and S_INLINE_ATTACHMENT_OPTIONS %}<input type="button" value="{{ lang('PLACE_INLINE') }}" class="button2 file-inline-bbcode" /> {% endif %}
|
||||
<input type="submit" name="delete_file[{attach_row.ASSOC_INDEX}]" value="{L_DELETE_FILE}" class="button2 file-delete" />
|
||||
</span>
|
||||
{% EVENT posting_attach_body_attach_row_controls_append %}
|
||||
<span class="clear"></span>
|
||||
</td>
|
||||
<td class="attach-comment">
|
||||
<textarea name="comment_list[{attach_row.ASSOC_INDEX}]" rows="1" cols="30" class="inputbox">{attach_row.FILE_COMMENT}</textarea>
|
||||
{attach_row.S_HIDDEN}
|
||||
</td>
|
||||
<td class="attach-filesize">
|
||||
<span class="file-size">{attach_row.FILESIZE}</span>
|
||||
</td>
|
||||
<td class="attach-status">
|
||||
<span class="file-status file-uploaded"></span>
|
||||
</td>
|
||||
</tr>
|
||||
{% EVENT posting_attach_body_attach_row_append %}
|
||||
<!-- END attach_row -->
|
||||
{% EVENT posting_attach_body_attach_row_after %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
{% EVENT posting_attach_body_file_list_after %}
|
||||
</div>
|
||||
</div>
|
6
public/styles/prosilver/template/posting_body.html
Normal file
6
public/styles/prosilver/template/posting_body.html
Normal file
|
@ -0,0 +1,6 @@
|
|||
|
||||
<!-- IF S_PRIVMSGS -->
|
||||
<!-- INCLUDE posting_pm_layout.html -->
|
||||
<!-- ELSE -->
|
||||
<!-- INCLUDE posting_layout.html -->
|
||||
<!-- ENDIF -->
|
105
public/styles/prosilver/template/posting_buttons.html
Normal file
105
public/styles/prosilver/template/posting_buttons.html
Normal file
|
@ -0,0 +1,105 @@
|
|||
|
||||
<script>
|
||||
var form_name = 'postform';
|
||||
var text_name = <!-- IF $SIG_EDIT -->'signature'<!-- ELSE -->'message'<!-- ENDIF -->;
|
||||
var load_draft = false;
|
||||
var upload = false;
|
||||
|
||||
// Define the bbCode tags
|
||||
var bbcode = new Array();
|
||||
var bbtags = new Array('[b]','[/b]','[i]','[/i]','[u]','[/u]','[quote]','[/quote]','[code]','[/code]','[list]','[/list]','[list=]','[/list]','[img]','[/img]','[url]','[/url]','[flash=]', '[/flash]','[size=]','[/size]'<!-- BEGIN custom_tags -->, {custom_tags.BBCODE_NAME}<!-- END custom_tags -->);
|
||||
var imageTag = false;
|
||||
|
||||
function change_palette()
|
||||
{
|
||||
phpbb.toggleDisplay('colour_palette');
|
||||
e = document.getElementById('colour_palette');
|
||||
|
||||
if (e.style.display == 'block')
|
||||
{
|
||||
document.getElementById('bbpalette').value = '{LA_FONT_COLOR_HIDE}';
|
||||
}
|
||||
else
|
||||
{
|
||||
document.getElementById('bbpalette').value = '{LA_FONT_COLOR}';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/editor.js -->
|
||||
|
||||
<!-- IF S_BBCODE_ALLOWED -->
|
||||
<div id="colour_palette" style="display: none;">
|
||||
<dl style="clear: left;">
|
||||
<dt><label>{L_FONT_COLOR}{L_COLON}</label></dt>
|
||||
<dd id="color_palette_placeholder" class="color_palette_placeholder" data-color-palette="h" data-height="12" data-width="15" data-bbcode="true"></dd>
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<!-- EVENT posting_editor_buttons_before -->
|
||||
<div id="format-buttons" class="format-buttons">
|
||||
<button type="button" class="button button-icon-only bbcode-b" accesskey="b" name="addbbcode0" value=" B " onclick="bbstyle(0)" title="{L_BBCODE_B_HELP}">
|
||||
<i class="icon fa-bold fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" class="button button-icon-only bbcode-i" accesskey="i" name="addbbcode2" value=" i " onclick="bbstyle(2)" title="{L_BBCODE_I_HELP}">
|
||||
<i class="icon fa-italic fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" class="button button-icon-only bbcode-u" accesskey="u" name="addbbcode4" value=" u " onclick="bbstyle(4)" title="{L_BBCODE_U_HELP}">
|
||||
<i class="icon fa-underline fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<!-- IF S_BBCODE_QUOTE -->
|
||||
<button type="button" class="button button-icon-only bbcode-quote" accesskey="q" name="addbbcode6" value="Quote" onclick="bbstyle(6)" title="{L_BBCODE_Q_HELP}">
|
||||
<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<!-- ENDIF -->
|
||||
<button type="button" class="button button-icon-only bbcode-code" accesskey="c" name="addbbcode8" value="Code" onclick="bbstyle(8)" title="{L_BBCODE_C_HELP}">
|
||||
<i class="icon fa-code fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" class="button button-icon-only bbcode-list" accesskey="l" name="addbbcode10" value="List" onclick="bbstyle(10)" title="{L_BBCODE_L_HELP}">
|
||||
<i class="icon fa-list fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" class="button button-icon-only bbcode-list-" accesskey="o" name="addbbcode12" value="List=" onclick="bbstyle(12)" title="{L_BBCODE_O_HELP}">
|
||||
<i class="icon fa-list-ol fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<button type="button" class="button button-icon-only bbcode-asterisk" accesskey="y" name="addlistitem" value="[*]" onclick="bbstyle(-1)" title="{L_BBCODE_LISTITEM_HELP}">
|
||||
<i class="icon fa-asterisk fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<!-- IF S_BBCODE_IMG -->
|
||||
<button type="button" class="button button-icon-only bbcode-img" accesskey="p" name="addbbcode14" value="Img" onclick="bbstyle(14)" title="{L_BBCODE_P_HELP}">
|
||||
<i class="icon fa-image fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_LINKS_ALLOWED -->
|
||||
<button type="button" class="button button-icon-only bbcode-url" accesskey="w" name="addbbcode16" value="URL" onclick="bbstyle(16)" title="{L_BBCODE_W_HELP}">
|
||||
<i class="icon fa-link fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_BBCODE_FLASH -->
|
||||
<button type="button" class="button button-icon-only bbcode-flash" accesskey="d" name="addbbcode18" value="Flash" onclick="bbstyle(18)" title="{L_BBCODE_D_HELP}">
|
||||
<i class="icon fa-flash fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<!-- ENDIF -->
|
||||
<button type="button" class="button button-icon-only bbcode-color" name="bbpalette" id="bbpalette" value="{L_FONT_COLOR}" onclick="change_palette();" title="{L_BBCODE_S_HELP}">
|
||||
<i class="icon fa-tint fa-fw" aria-hidden="true"></i>
|
||||
</button>
|
||||
<select name="addbbcode20" class="bbcode-size" onchange="bbfontstyle('[size=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value + ']', '[/size]');this.form.addbbcode20.selectedIndex = 2;" title="{L_BBCODE_F_HELP}">
|
||||
<option value="50">{L_FONT_TINY}</option>
|
||||
<option value="85">{L_FONT_SMALL}</option>
|
||||
<option value="100" selected="selected">{L_FONT_NORMAL}</option>
|
||||
<!-- IF not MAX_FONT_SIZE or MAX_FONT_SIZE >= 150 -->
|
||||
<option value="150">{L_FONT_LARGE}</option>
|
||||
<!-- IF not MAX_FONT_SIZE or MAX_FONT_SIZE >= 200 -->
|
||||
<option value="200">{L_FONT_HUGE}</option>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
</select>
|
||||
|
||||
<!-- EVENT posting_editor_buttons_custom_tags_before -->
|
||||
|
||||
<!-- BEGIN custom_tags -->
|
||||
<button type="button" class="button button-secondary bbcode-{custom_tags.BBCODE_TAG_CLEAN}" name="addbbcode{custom_tags.BBCODE_ID}" value="{custom_tags.BBCODE_TAG}" onclick="bbstyle({custom_tags.BBCODE_ID})" title="{{ custom_tags.BBCODE_HELPLINE }}">
|
||||
{custom_tags.BBCODE_TAG}
|
||||
</button>
|
||||
<!-- END custom_tags -->
|
||||
</div>
|
||||
<!-- EVENT posting_editor_buttons_after -->
|
||||
<!-- ENDIF -->
|
204
public/styles/prosilver/template/posting_editor.html
Normal file
204
public/styles/prosilver/template/posting_editor.html
Normal file
|
@ -0,0 +1,204 @@
|
|||
<fieldset class="fields1">
|
||||
<!-- IF ERROR --><p class="error">{ERROR}</p><!-- ENDIF -->
|
||||
|
||||
{% EVENT posting_editor_topic_icons_before %}
|
||||
|
||||
<!-- IF S_SHOW_TOPIC_ICONS or S_SHOW_PM_ICONS -->
|
||||
<dl>
|
||||
<dt><label for="icon">{L_ICON}{L_COLON}</label></dt>
|
||||
<dd>
|
||||
{% EVENT posting_editor_topic_icons_prepend %}
|
||||
|
||||
<label for="icon"><input type="radio" name="icon" id="icon" value="0" checked="checked" tabindex="1" /> <!-- IF S_SHOW_TOPIC_ICONS -->{L_NO_TOPIC_ICON}<!-- ELSE -->{L_NO_PM_ICON}<!-- ENDIF --></label>
|
||||
<!-- BEGIN topic_icon --><label for="icon-{topic_icon.ICON_ID}"><input type="radio" name="icon" id="icon-{topic_icon.ICON_ID}" value="{topic_icon.ICON_ID}" {topic_icon.S_ICON_CHECKED} tabindex="1" /><img src="{topic_icon.ICON_IMG}" width="{topic_icon.ICON_WIDTH}" height="{topic_icon.ICON_HEIGHT}" alt="{topic_icon.ICON_ALT}" title="{topic_icon.ICON_ALT}" /></label> <!-- END topic_icon -->
|
||||
|
||||
{% EVENT posting_editor_topic_icons_append %}
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
{% EVENT posting_editor_topic_icons_after %}
|
||||
|
||||
<!-- IF not S_PRIVMSGS and S_DISPLAY_USERNAME -->
|
||||
<dl style="clear: left;">
|
||||
<dt><label for="username">{L_USERNAME}{L_COLON}</label></dt>
|
||||
<dd><input type="text" tabindex="1" name="username" id="username" size="25" value="{USERNAME}" class="inputbox autowidth" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT posting_editor_subject_before -->
|
||||
|
||||
<!-- IF S_POST_ACTION or S_PRIVMSGS or S_EDIT_DRAFT -->
|
||||
<dl style="clear: left;">
|
||||
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
|
||||
<dd>
|
||||
<!-- EVENT posting_editor_subject_prepend -->
|
||||
<input type="text" name="subject" id="subject" size="45" maxlength="<!-- IF S_NEW_MESSAGE -->120<!-- ELSE -->124<!-- ENDIF -->" tabindex="2" value="{SUBJECT}{DRAFT_SUBJECT}" class="inputbox autowidth" />
|
||||
<!-- EVENT posting_editor_subject_append -->
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- IF CAPTCHA_TEMPLATE and S_CONFIRM_CODE -->
|
||||
<!-- DEFINE $CAPTCHA_TAB_INDEX = 3 -->
|
||||
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT posting_editor_subject_after -->
|
||||
|
||||
<!-- INCLUDE posting_buttons.html -->
|
||||
|
||||
<div id="smiley-box" class="smiley-box">
|
||||
<!-- EVENT posting_editor_smilies_before -->
|
||||
<!-- IF S_SMILIES_ALLOWED and .smiley -->
|
||||
<strong>{L_SMILIES}</strong><br />
|
||||
<!-- BEGIN smiley -->
|
||||
<a href="#" onclick="insert_text('{smiley.A_SMILEY_CODE}', true); return false;"><img src="{smiley.SMILEY_IMG}" width="{smiley.SMILEY_WIDTH}" height="{smiley.SMILEY_HEIGHT}" alt="{smiley.SMILEY_CODE}" title="{smiley.SMILEY_DESC}" /></a>
|
||||
<!-- END smiley -->
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_SHOW_SMILEY_LINK and S_SMILIES_ALLOWED -->
|
||||
<br /><a href="{U_MORE_SMILIES}" onclick="popup(this.href, 750, 350, '_phpbbsmilies'); return false;">{L_MORE_SMILIES}</a>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT posting_editor_smilies_after -->
|
||||
<!-- IF BBCODE_STATUS -->
|
||||
<div class="bbcode-status">
|
||||
<!-- IF .smiley --><hr /><!-- ENDIF -->
|
||||
{BBCODE_STATUS}<br />
|
||||
<!-- IF S_BBCODE_ALLOWED -->
|
||||
{IMG_STATUS}<br />
|
||||
{FLASH_STATUS}<br />
|
||||
{URL_STATUS}<br />
|
||||
<!-- ENDIF -->
|
||||
{SMILIES_STATUS}
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT posting_editor_bbcode_status_after -->
|
||||
<!-- IF S_EDIT_DRAFT || S_DISPLAY_REVIEW -->
|
||||
<!-- IF S_DISPLAY_REVIEW --><hr /><!-- ENDIF -->
|
||||
<!-- IF S_EDIT_DRAFT --><strong><a href="{S_UCP_ACTION}">{L_BACK_TO_DRAFTS}</a></strong><!-- ENDIF -->
|
||||
<!-- IF S_DISPLAY_REVIEW --><strong><a href="#review">{L_TOPIC_REVIEW}</a></strong><!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
<!-- EVENT posting_editor_message_before -->
|
||||
|
||||
<div id="message-box" class="message-box">
|
||||
<textarea <!-- IF S_UCP_ACTION and not S_PRIVMSGS and not S_EDIT_DRAFT -->name="signature" id="signature" style="height: 9em;"<!-- ELSE -->name="message" id="message"<!-- ENDIF --> rows="15" cols="76" tabindex="4" onselect="storeCaret(this);" onclick="storeCaret(this);" onkeyup="storeCaret(this);" onfocus="initInsertions();" class="inputbox">{MESSAGE}{DRAFT_MESSAGE}{SIGNATURE}</textarea>
|
||||
</div>
|
||||
|
||||
<!-- EVENT posting_editor_message_after -->
|
||||
</fieldset>
|
||||
|
||||
<!-- IF $EXTRA_POSTING_OPTIONS eq 1 -->
|
||||
|
||||
<!-- IF not S_SHOW_DRAFTS -->
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
|
||||
<div class="panel bg2">
|
||||
<div class="inner">
|
||||
<fieldset class="submit-buttons">
|
||||
{S_HIDDEN_ADDRESS_FIELD}
|
||||
{S_HIDDEN_FIELDS}
|
||||
<!-- EVENT posting_editor_submit_buttons -->
|
||||
<!-- IF S_HAS_DRAFTS --><input type="submit" accesskey="d" tabindex="8" name="load" value="{L_LOAD_DRAFT}" class="button2" onclick="load_draft = true;" /> <!-- ENDIF -->
|
||||
<!-- IF S_SAVE_ALLOWED --><input type="submit" accesskey="k" tabindex="7" name="save" value="{L_SAVE_DRAFT}" class="button2" /> <!-- ENDIF -->
|
||||
<input type="submit" tabindex="5" name="preview" value="{L_PREVIEW}" class="button1"<!-- IF not S_PRIVMSGS --> onclick="document.getElementById('postform').action += '#preview';"<!-- ENDIF --> />
|
||||
<input type="submit" accesskey="s" tabindex="6" name="post" value="{L_SUBMIT}" class="button1 default-submit-action" />
|
||||
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_PRIVMSGS and not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
|
||||
<div id="tabs" class="tabs sub-panels" data-show-panel="<!-- IF SHOW_PANEL -->{SHOW_PANEL}<!-- ELSE -->options-panel<!-- ENDIF -->" role="tablist">
|
||||
<ul>
|
||||
<li id="options-panel-tab" class="tab activetab"><a href="#tabs" data-subpanel="options-panel" role="tab" aria-controls="options-panel"><span>{L_OPTIONS}</span></a></li>
|
||||
<!-- IF S_SHOW_ATTACH_BOX and FILTERS -->
|
||||
<li id="attach-panel-tab" class="tab">
|
||||
<a href="#tabs" data-subpanel="attach-panel" role="tab" aria-controls="attach-panel">
|
||||
{L_ATTACHMENTS} <strong id="file-total-progress" class="file-total-progress"><strong id="file-total-progress-bar" class="file-total-progress-bar"></strong></strong>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_SHOW_POLL_BOX || S_POLL_DELETE -->
|
||||
<li id="poll-panel-tab" class="tab">
|
||||
<a href="#tabs" data-subpanel="poll-panel" role="tab" aria-controls="poll-panel">{L_ADD_POLL}</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
<!-- EVENT posting_editor_add_panel_tab -->
|
||||
</ul>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF not S_SHOW_DRAFTS and not $SIG_EDIT eq 1 -->
|
||||
<div class="panel bg3" id="options-panel">
|
||||
<div class="inner">
|
||||
|
||||
<fieldset class="fields1">
|
||||
<!-- EVENT posting_editor_options_prepend -->
|
||||
<!-- IF S_BBCODE_ALLOWED -->
|
||||
<div><label for="disable_bbcode"><input type="checkbox" name="disable_bbcode" id="disable_bbcode"{S_BBCODE_CHECKED} /> {L_DISABLE_BBCODE}</label></div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_SMILIES_ALLOWED -->
|
||||
<div><label for="disable_smilies"><input type="checkbox" name="disable_smilies" id="disable_smilies"{S_SMILIES_CHECKED} /> {L_DISABLE_SMILIES}</label></div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_LINKS_ALLOWED -->
|
||||
<div><label for="disable_magic_url"><input type="checkbox" name="disable_magic_url" id="disable_magic_url"{S_MAGIC_URL_CHECKED} /> {L_DISABLE_MAGIC_URL}</label></div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_SIG_ALLOWED -->
|
||||
<div><label for="attach_sig"><input type="checkbox" name="attach_sig" id="attach_sig"{S_SIGNATURE_CHECKED} /> {L_ATTACH_SIG}</label></div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_NOTIFY_ALLOWED -->
|
||||
<div><label for="notify"><input type="checkbox" name="notify" id="notify"{S_NOTIFY_CHECKED} /> {L_NOTIFY_REPLY}</label></div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_LOCK_TOPIC_ALLOWED -->
|
||||
<div><label for="lock_topic"><input type="checkbox" name="lock_topic" id="lock_topic"{S_LOCK_TOPIC_CHECKED} /> {L_LOCK_TOPIC}</label></div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_LOCK_POST_ALLOWED -->
|
||||
<div><label for="lock_post"><input type="checkbox" name="lock_post" id="lock_post"{S_LOCK_POST_CHECKED} /> {L_LOCK_POST} [{L_LOCK_POST_EXPLAIN}]</label></div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_TYPE_TOGGLE or S_TOPIC_TYPE_ANNOUNCE or S_TOPIC_TYPE_STICKY -->
|
||||
<hr class="dashed" />
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_TYPE_TOGGLE -->
|
||||
<dl>
|
||||
<dt><label for="topic_type-0"><!-- IF S_EDIT_POST -->{L_CHANGE_TOPIC_TO}<!-- ELSE -->{L_POST_TOPIC_AS}<!-- ENDIF -->{L_COLON}</label></dt>
|
||||
<dd><!-- BEGIN topic_type --><label for="topic_type-{topic_type.VALUE}"><input type="radio" name="topic_type" id="topic_type-{topic_type.VALUE}" value="{topic_type.VALUE}"{topic_type.S_CHECKED} />{topic_type.L_TOPIC_TYPE}</label> <!-- END topic_type --></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_TOPIC_TYPE_ANNOUNCE or S_TOPIC_TYPE_STICKY -->
|
||||
<dl>
|
||||
<dt><label for="topic_time_limit">{L_STICK_TOPIC_FOR}{L_COLON}</label></dt>
|
||||
<dd><label for="topic_time_limit"><input type="number" min="0" max="999" name="topic_time_limit" id="topic_time_limit" value="{TOPIC_TIME_LIMIT}" class="inputbox autowidth" /> {L_DAYS}</label></dd>
|
||||
<dd>{L_STICK_TOPIC_FOR_EXPLAIN}</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_SOFTDELETE_ALLOWED or S_DELETE_ALLOWED -->
|
||||
<hr class="dashed" />
|
||||
<dl>
|
||||
<dt><label for="delete">{L_DELETE_POST}{L_COLON}</label></dt>
|
||||
<dd><label for="delete"><input type="checkbox" name="delete" id="delete" {S_SOFTDELETE_CHECKED} /> {L_DELETE_POST_WARN}</label></dd>
|
||||
<!-- IF S_DELETE_ALLOWED and S_SOFTDELETE_ALLOWED -->
|
||||
<dd><label for="delete_permanent"><input type="checkbox" name="delete_permanent" id="delete_permanent" /> {L_DELETE_POST_PERMANENTLY}</label></dd>
|
||||
<!-- ENDIF -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_EDIT_REASON -->
|
||||
<dl>
|
||||
<dt><label for="edit_reason">{L_EDIT_REASON}{L_COLON}</label></dt>
|
||||
<dd><input type="text" name="edit_reason" id="edit_reason" value="{EDIT_REASON}" class="inputbox" /></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- ENDIF -->
|
65
public/styles/prosilver/template/posting_layout.html
Normal file
65
public/styles/prosilver/template/posting_layout.html
Normal file
|
@ -0,0 +1,65 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<!-- IF TOPIC_TITLE -->
|
||||
<h2 class="posting-title"><!-- EVENT posting_topic_title_before --><a href="{U_VIEW_TOPIC}">{TOPIC_TITLE}</a><!-- EVENT posting_topic_title_after --></h2>
|
||||
<!-- ELSE -->
|
||||
<h2 class="posting-title"><a href="{U_VIEW_FORUM}">{FORUM_NAME}</a></h2>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_FORUM_RULES -->
|
||||
<div class="rules<!-- IF U_FORUM_RULES --> rules-link<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
|
||||
<!-- IF U_FORUM_RULES -->
|
||||
<a href="{U_FORUM_RULES}">{L_FORUM_RULES}</a>
|
||||
<!-- ELSE -->
|
||||
<strong>{L_FORUM_RULES}</strong><br />
|
||||
{FORUM_RULES}
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<form id="postform" method="post" action="{S_POST_ACTION}"{S_FORM_ENCTYPE}>
|
||||
|
||||
<!-- IF S_DRAFT_LOADED -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_INFORMATION}</h3>
|
||||
<p>{L_DRAFT_LOADED}</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_SHOW_DRAFTS --><!-- INCLUDE drafts.html --><!-- ENDIF -->
|
||||
|
||||
<!-- IF S_POST_REVIEW --><!-- INCLUDE posting_review.html --><!-- ENDIF -->
|
||||
|
||||
<!-- IF S_DISPLAY_PREVIEW --><!-- INCLUDE posting_preview.html --><!-- ENDIF -->
|
||||
|
||||
<div class="panel" id="postingbox">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_POST_A}</h3>
|
||||
|
||||
<!-- DEFINE $EXTRA_POSTING_OPTIONS = 1 -->
|
||||
<!-- INCLUDE posting_editor.html -->
|
||||
<input type="hidden" name="show_panel" value="options-panel" />
|
||||
{S_FORM_TOKEN}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_SHOW_ATTACH_BOX and FILTERS --><!-- INCLUDE posting_attach_body.html --><!-- ENDIF -->
|
||||
|
||||
<!-- IF S_SHOW_POLL_BOX or S_POLL_DELETE --><!-- INCLUDE posting_poll_body.html --><!-- ENDIF -->
|
||||
|
||||
<!-- EVENT posting_layout_include_panel_body -->
|
||||
|
||||
<!-- IF S_DISPLAY_REVIEW --><!-- INCLUDE posting_topic_review.html --><!-- ENDIF -->
|
||||
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
83
public/styles/prosilver/template/posting_pm_header.html
Normal file
83
public/styles/prosilver/template/posting_pm_header.html
Normal file
|
@ -0,0 +1,83 @@
|
|||
<fieldset class="fields1">
|
||||
<!-- IF not S_SHOW_DRAFTS -->
|
||||
|
||||
<!-- IF S_GROUP_OPTIONS -->
|
||||
<div class="column2">
|
||||
<label for="group_list"><strong>{L_TO_ADD_GROUPS}{L_COLON}</strong></label><br />
|
||||
<select name="group_list[]" id="group_list" multiple="multiple" size="3" class="inputbox">{S_GROUP_OPTIONS}</select><br />
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF S_ALLOW_MASS_PM -->
|
||||
<div class="column1">
|
||||
<!-- IF not S_EDIT_POST -->
|
||||
<dl class="pmlist">
|
||||
<dt><label><strong>{L_TO_ADD_MASS}{L_COLON}</strong><textarea id="username_list" name="username_list" class="inputbox" cols="50" rows="2" tabindex="1"></textarea></label></dt>
|
||||
<dd class="recipients">
|
||||
<input type="submit" name="add_to" value="{L_ADD}" class="button2" tabindex="1" />
|
||||
<input type="submit" name="add_bcc" value="{L_ADD_BCC}" class="button2" tabindex="1" />
|
||||
<!-- EVENT posting_pm_header_find_username_before -->
|
||||
<span><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false;">{L_FIND_USERNAME}</a></span>
|
||||
<!-- EVENT posting_pm_header_find_username_after -->
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
<!-- IF .to_recipient or .bcc_recipient --><hr /><!-- ENDIF -->
|
||||
<div class="column1">
|
||||
<!-- IF .to_recipient -->
|
||||
<dl>
|
||||
<dt><label>{L_TO_MASS}{L_COLON}</label></dt>
|
||||
<dd class="recipients">
|
||||
<ul class="recipients">
|
||||
<!-- BEGIN to_recipient -->
|
||||
<li>
|
||||
<!-- IF not S_EDIT_POST --><input type="submit" name="remove_{to_recipient.TYPE}[{to_recipient.UG_ID}]" value="x" class="button2" /><!-- ENDIF -->
|
||||
<!-- IF to_recipient.IS_GROUP --><a href="{to_recipient.U_VIEW}" style="color: {{ to_recipient.COLOUR }}"><strong>{to_recipient.NAME}</strong></a><!-- ELSE -->{to_recipient.NAME_FULL}<!-- ENDIF -->
|
||||
</li>
|
||||
<!-- END to_recipient -->
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
<!-- IF .bcc_recipient -->
|
||||
<div class="column2">
|
||||
<dl>
|
||||
<dt><label>{L_BCC}{L_COLON}</label></dt>
|
||||
<dd class="recipients">
|
||||
<ul class="recipients">
|
||||
<!-- BEGIN bcc_recipient -->
|
||||
<li>
|
||||
<!-- IF not S_EDIT_POST --><input type="submit" name="remove_{bcc_recipient.TYPE}[{bcc_recipient.UG_ID}]" value="x" class="button2" /><!-- ENDIF -->
|
||||
<!-- IF bcc_recipient.IS_GROUP --><a href="{bcc_recipient.U_VIEW}" style="color: {{ bcc_recipient.COLOUR }}"><strong>{bcc_recipient.NAME}</strong></a><!-- ELSE -->{bcc_recipient.NAME_FULL}<!-- ENDIF -->
|
||||
</li>
|
||||
<!-- END bcc_recipient -->
|
||||
</ul>
|
||||
</dd>
|
||||
</dl>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<!-- ELSE -->
|
||||
<div class="column1">
|
||||
<dl>
|
||||
<dt><label for="username_list">{L_TO_ADD}{L_COLON}</label><!-- IF not S_EDIT_POST --><br /><span><a href="{U_FIND_USERNAME}" onclick="find_username(this.href); return false">{L_FIND_USERNAME}</a></span><!-- ENDIF --></dt>
|
||||
<!-- IF not S_EDIT_POST -->
|
||||
<dd><input class="inputbox" type="text" name="username_list" id="username_list" size="20" value="" /> <input type="submit" name="add_to" value="{L_ADD}" class="button2" /></dd>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF .to_recipient -->
|
||||
<dd class="recipients">
|
||||
<ul class="recipients">
|
||||
<!-- BEGIN to_recipient -->
|
||||
<li>
|
||||
<!-- IF to_recipient.IS_GROUP --><a href="{to_recipient.U_VIEW}"><strong>{to_recipient.NAME}</strong></a><!-- ELSE -->{to_recipient.NAME_FULL}<!-- ENDIF -->
|
||||
<!-- IF not S_EDIT_POST --><input type="submit" name="remove_{to_recipient.TYPE}[{to_recipient.UG_ID}]" value="x" class="button2" /><!-- ENDIF -->
|
||||
</li>
|
||||
<!-- END to_recipient -->
|
||||
</dd>
|
||||
<!-- ENDIF -->
|
||||
</dl>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
43
public/styles/prosilver/template/posting_pm_layout.html
Normal file
43
public/styles/prosilver/template/posting_pm_layout.html
Normal file
|
@ -0,0 +1,43 @@
|
|||
<!-- INCLUDE ucp_header.html -->
|
||||
|
||||
<!-- IF S_DRAFT_LOADED -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<h3>{L_INFORMATION}</h3>
|
||||
<p>{L_DRAFT_LOADED_PM}</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_SHOW_DRAFTS --><!-- INCLUDE drafts.html --><!-- ENDIF -->
|
||||
|
||||
<!-- IF S_DISPLAY_PREVIEW --><!-- INCLUDE posting_preview.html --><!-- ENDIF -->
|
||||
|
||||
<h2 class="posting-title">{L_TITLE}</h2>
|
||||
|
||||
<div class="panel" id="pmheader-postingbox">
|
||||
<div class="inner">
|
||||
<!-- EVENT posting_pm_layout_include_pm_header_before -->
|
||||
<!-- INCLUDE posting_pm_header.html -->
|
||||
<!-- EVENT posting_pm_layout_include_pm_header_after -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel" id="postingbox">
|
||||
<div class="inner">
|
||||
|
||||
<!-- DEFINE $EXTRA_POSTING_OPTIONS = 1 -->
|
||||
<!-- INCLUDE posting_editor.html -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- IF S_SHOW_ATTACH_BOX and FILTERS --><!-- INCLUDE posting_attach_body.html --><!-- ENDIF -->
|
||||
|
||||
<!-- IF S_DISPLAY_REVIEW --><!-- INCLUDE posting_topic_review.html --><!-- ENDIF -->
|
||||
|
||||
<!-- IF S_DISPLAY_HISTORY --><!-- INCLUDE ucp_pm_history.html --><!-- ENDIF -->
|
||||
|
||||
<!-- INCLUDE ucp_footer.html -->
|
53
public/styles/prosilver/template/posting_poll_body.html
Normal file
53
public/styles/prosilver/template/posting_poll_body.html
Normal file
|
@ -0,0 +1,53 @@
|
|||
<div class="panel bg3" id="poll-panel">
|
||||
<div class="inner">
|
||||
|
||||
<!-- IF S_SHOW_POLL_BOX -->
|
||||
<p>{L_ADD_POLL_EXPLAIN}</p>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<fieldset class="fields2">
|
||||
<!-- IF S_POLL_DELETE -->
|
||||
<dl>
|
||||
<dt><label for="poll_delete">{L_POLL_DELETE}{L_COLON}</label></dt>
|
||||
<dd><label for="poll_delete"><input type="checkbox" name="poll_delete" id="poll_delete"<!-- IF S_POLL_DELETE_CHECKED --> checked="checked"<!-- ENDIF --> /> </label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF S_SHOW_POLL_BOX -->
|
||||
<dl>
|
||||
<dt><label for="poll_title">{{ lang('POLL_QUESTION') ~ lang('COLON') }}</label></dt>
|
||||
<dd><input type="text" name="poll_title" id="poll_title" maxlength="100" value="{{ POLL_TITLE }}" class="inputbox" /></dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="poll_option_text">{L_POLL_OPTIONS}{L_COLON}</label><br /><span>{L_POLL_OPTIONS_EXPLAIN}</span></dt>
|
||||
<dd><textarea name="poll_option_text" id="poll_option_text" rows="5" cols="35" class="inputbox">{POLL_OPTIONS}</textarea></dd>
|
||||
</dl>
|
||||
|
||||
<hr class="dashed" />
|
||||
|
||||
<dl>
|
||||
<dt><label for="poll_max_options">{L_POLL_MAX_OPTIONS}{L_COLON}</label></dt>
|
||||
<dd><input type="number" min="0" max="999" name="poll_max_options" id="poll_max_options" value="{POLL_MAX_OPTIONS}" class="inputbox autowidth" /></dd>
|
||||
<dd>{L_POLL_MAX_OPTIONS_EXPLAIN}</dd>
|
||||
</dl>
|
||||
<dl>
|
||||
<dt><label for="poll_length">{L_POLL_FOR}{L_COLON}</label></dt>
|
||||
<dd><label for="poll_length"><input type="number" min="0" max="999" name="poll_length" id="poll_length" value="{POLL_LENGTH}" class="inputbox autowidth" /> {L_DAYS}</label></dd>
|
||||
<dd>{L_POLL_FOR_EXPLAIN}</dd>
|
||||
</dl>
|
||||
|
||||
<!-- IF S_POLL_VOTE_CHANGE -->
|
||||
<hr class="dashed" />
|
||||
|
||||
<dl>
|
||||
<dt><label for="poll_vote_change">{L_POLL_VOTE_CHANGE}{L_COLON}</label></dt>
|
||||
<dd><label for="poll_vote_change"><input type="checkbox" id="poll_vote_change" name="poll_vote_change"{VOTE_CHANGE_CHECKED} /> {L_POLL_VOTE_CHANGE_EXPLAIN}</label></dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT posting_poll_body_options_after -->
|
||||
</fieldset>
|
||||
|
||||
</div>
|
||||
</div>
|
51
public/styles/prosilver/template/posting_preview.html
Normal file
51
public/styles/prosilver/template/posting_preview.html
Normal file
|
@ -0,0 +1,51 @@
|
|||
<div class="post <!-- IF S_PRIVMSGS -->pm<!-- ELSE -->bg2<!-- ENDIF -->" id="preview">
|
||||
<div class="inner">
|
||||
|
||||
<!-- IF S_HAS_POLL_OPTIONS -->
|
||||
<div class="content">
|
||||
<h2>{L_PREVIEW}{L_COLON} {POLL_QUESTION}</h2>
|
||||
<p class="author"><!-- IF L_POLL_LENGTH -->{L_POLL_LENGTH}<br /><!-- ENDIF -->{L_MAX_VOTES}</p>
|
||||
|
||||
<fieldset class="polls">
|
||||
<!-- BEGIN poll_option -->
|
||||
<dl>
|
||||
<dt><label for="vote_{poll_option.POLL_OPTION_ID}">{poll_option.POLL_OPTION_CAPTION}</label></dt>
|
||||
<dd style="width: auto;"><!-- IF S_IS_MULTI_CHOICE --><input type="checkbox" name="vote_id[]" id="vote_{poll_option.POLL_OPTION_ID}" value="{poll_option.POLL_OPTION_ID}"<!-- IF poll_option.POLL_OPTION_VOTED --> checked="checked"<!-- ENDIF --> /><!-- ELSE --><input type="radio" name="vote_id[]" id="vote_{poll_option.POLL_OPTION_ID}" value="{poll_option.POLL_OPTION_ID}"<!-- IF poll_option.POLL_OPTION_VOTED --> checked="checked"<!-- ENDIF --> /><!-- ENDIF --></dd>
|
||||
</dl>
|
||||
<!-- END poll_option -->
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="post bg2">
|
||||
<div class="inner">
|
||||
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT posting_preview_poll_after -->
|
||||
|
||||
<div class="postbody">
|
||||
<h3>{L_PREVIEW}{L_COLON} {PREVIEW_SUBJECT}</h3>
|
||||
|
||||
<div class="content">{PREVIEW_MESSAGE}</div>
|
||||
|
||||
<!-- EVENT posting_preview_content_after -->
|
||||
|
||||
<!-- IF .attachment -->
|
||||
<dl class="attachbox">
|
||||
<dt>{L_ATTACHMENTS}</dt>
|
||||
<!-- BEGIN attachment -->
|
||||
<dd>{attachment.DISPLAY_ATTACHMENT}</dd>
|
||||
<!-- END attachment -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF PREVIEW_SIGNATURE --><div class="signature">{PREVIEW_SIGNATURE}</div><!-- ENDIF -->
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<hr />
|
44
public/styles/prosilver/template/posting_review.html
Normal file
44
public/styles/prosilver/template/posting_review.html
Normal file
|
@ -0,0 +1,44 @@
|
|||
<h3>{L_POST_REVIEW}</h3>
|
||||
|
||||
<p>{L_POST_REVIEW_EXPLAIN}</p>
|
||||
|
||||
<!-- BEGIN post_review_row -->
|
||||
<!-- IF post_review_row.S_IGNORE_POST -->
|
||||
<div class="post bg3 post-ignore">
|
||||
<div class="inner">
|
||||
{post_review_row.L_IGNORE_POST}
|
||||
<!-- ELSE -->
|
||||
<div class="post <!-- IF post_review_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="postbody" id="ppr{post_review_row.POST_ID}">
|
||||
<h3><a href="{post_review_row.U_MINI_POST}">{post_review_row.POST_SUBJECT}</a></h3>
|
||||
<p class="author">
|
||||
<!-- IF S_IS_BOT -->
|
||||
<span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{post_review_row.MINI_POST}</span></span>
|
||||
<!-- ELSE -->
|
||||
<a href="{post_review_row.U_MINI_POST}" title="{post_review_row.MINI_POST}">
|
||||
<i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{post_review_row.MINI_POST}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
{L_POST_BY_AUTHOR} <!-- EVENT posting_review_row_post_author_username_prepend --><strong>{post_review_row.POST_AUTHOR_FULL}</strong><!-- EVENT posting_review_row_post_author_username_append --> » {post_review_row.POST_DATE}
|
||||
</p>
|
||||
<div class="content">{post_review_row.MESSAGE}</div>
|
||||
|
||||
<!-- IF post_review_row.S_HAS_ATTACHMENTS -->
|
||||
<dl class="attachbox">
|
||||
<dt>{L_ATTACHMENTS}</dt>
|
||||
<!-- BEGIN attachment -->
|
||||
<dd>{post_review_row.attachment.DISPLAY_ATTACHMENT}</dd>
|
||||
<!-- END attachment -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- END post_review_row -->
|
||||
|
||||
<hr />
|
25
public/styles/prosilver/template/posting_smilies.html
Normal file
25
public/styles/prosilver/template/posting_smilies.html
Normal file
|
@ -0,0 +1,25 @@
|
|||
<!-- INCLUDE simple_header.html -->
|
||||
|
||||
<script>
|
||||
var form_name = opener.form_name;
|
||||
var text_name = opener.text_name;
|
||||
</script>
|
||||
<!-- INCLUDEJS {T_ASSETS_PATH}/javascript/editor.js -->
|
||||
|
||||
<h2>{L_SMILIES}</h2>
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<!-- BEGIN smiley -->
|
||||
<a href="#" onclick="initInsertions(); insert_text('{smiley.A_SMILEY_CODE}', true, true); return false;"><img src="{smiley.SMILEY_IMG}" width="{smiley.SMILEY_WIDTH}" height="{smiley.SMILEY_HEIGHT}" alt="{smiley.SMILEY_CODE}" title="{smiley.SMILEY_DESC}" /></a>
|
||||
<!-- END smiley -->
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<!-- IF .pagination -->
|
||||
<div class="pagination">
|
||||
<!-- INCLUDE pagination.html -->
|
||||
</div>
|
||||
<!-- ENDIF -->
|
||||
<a href="#" onclick="window.close(); return false;">{L_CLOSE_WINDOW}</a>
|
||||
|
||||
<!-- INCLUDE simple_footer.html -->
|
89
public/styles/prosilver/template/posting_topic_review.html
Normal file
89
public/styles/prosilver/template/posting_topic_review.html
Normal file
|
@ -0,0 +1,89 @@
|
|||
|
||||
<h3 id="review" class="review">
|
||||
<span class="right-box"><a href="#review" onclick="viewableArea(getElementById('topicreview'), true); var rev_text = getElementById('review').getElementsByTagName('a').item(0).firstChild; if (rev_text.data == '{LA_EXPAND_VIEW}'){rev_text.data = '{LA_COLLAPSE_VIEW}'; } else if (rev_text.data == '{LA_COLLAPSE_VIEW}'){rev_text.data = '{LA_EXPAND_VIEW}'};">{L_EXPAND_VIEW}</a></span>
|
||||
{L_TOPIC_REVIEW}{L_COLON} {TOPIC_TITLE}
|
||||
</h3>
|
||||
|
||||
<div id="topicreview" class="topicreview">
|
||||
<script>
|
||||
bbcodeEnabled = {S_BBCODE_ALLOWED};
|
||||
</script>
|
||||
<!-- BEGIN topic_review_row -->
|
||||
|
||||
<!-- IF topic_review_row.S_IGNORE_POST -->
|
||||
<div class="post bg3 post-ignore">
|
||||
<div class="inner">
|
||||
{topic_review_row.L_IGNORE_POST}
|
||||
<!-- ELSE IF topic_review_row.S_POST_DELETED -->
|
||||
<div class="post bg3 post-ignore">
|
||||
<div class="inner">
|
||||
{topic_review_row.L_DELETE_POST}
|
||||
<!-- ELSE -->
|
||||
<div class="post <!-- IF topic_review_row.S_ROW_COUNT is odd -->bg1<!-- ELSE -->bg2<!-- ENDIF --><!-- IF topic_review_row.POST_ID == REPORTED_POST_ID --> reported<!-- ENDIF -->">
|
||||
<div class="inner">
|
||||
<!-- ENDIF -->
|
||||
|
||||
<div class="postbody" id="pr{topic_review_row.POST_ID}">
|
||||
<h3><a href="{topic_review_row.U_MINI_POST}">{topic_review_row.POST_SUBJECT}</a></h3>
|
||||
|
||||
<!-- IF (topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE) or topic_review_row.U_MCP_DETAILS -->
|
||||
<ul class="post-buttons">
|
||||
<!-- IF topic_review_row.U_MCP_DETAILS -->
|
||||
<li>
|
||||
<a href="{topic_review_row.U_MCP_DETAILS}" title="{L_POST_DETAILS}" class="button button-icon-only">
|
||||
<i class="icon fa-info fa-fw" aria-hidden="true"></i><span class="sr-only">{L_POST_DETAILS}</span>
|
||||
</a>
|
||||
<li>
|
||||
<!-- ENDIF -->
|
||||
<!-- IF topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE -->
|
||||
<li>
|
||||
<a href="#postingbox" onclick="addquote({topic_review_row.POST_ID}, '{topic_review_row.POSTER_QUOTE}', '{LA_WROTE}', {post_id:{topic_review_row.POST_ID},time:{topic_review_row.POST_TIME},user_id:{topic_review_row.USER_ID}});" title="{L_QUOTE} {topic_review_row.POST_AUTHOR}" class="button button-icon-only">
|
||||
<i class="icon fa-quote-left fa-fw" aria-hidden="true"></i><span class="sr-only">{L_QUOTE} {topic_review_row.POST_AUTHOR}</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- ENDIF -->
|
||||
</ul>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- EVENT posting_topic_review_row_post_details_before -->
|
||||
<p class="author">
|
||||
<!-- IF S_IS_BOT -->
|
||||
<span><i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{topic_review_row.MINI_POST}</span></span>
|
||||
<!-- ELSE -->
|
||||
<a href="{topic_review_row.U_MINI_POST}" title="{topic_review_row.MINI_POST}">
|
||||
<i class="icon fa-file fa-fw icon-lightgray icon-md" aria-hidden="true"></i><span class="sr-only">{topic_review_row.MINI_POST}</span>
|
||||
</a>
|
||||
<!-- ENDIF -->
|
||||
{L_POST_BY_AUTHOR} <!-- EVENT posting_topic_review_row_post_author_username_prepend --><strong>{topic_review_row.POST_AUTHOR_FULL}</strong><!-- EVENT posting_topic_review_row_post_author_username_append --> » {topic_review_row.POST_DATE}
|
||||
</p>
|
||||
<!-- EVENT posting_topic_review_row_post_details_after -->
|
||||
|
||||
<div class="content">{topic_review_row.MESSAGE}</div>
|
||||
|
||||
<!-- EVENT posting_topic_review_row_content_after -->
|
||||
|
||||
<!-- IF topic_review_row.S_HAS_ATTACHMENTS -->
|
||||
<dl class="attachbox">
|
||||
<dt>{L_ATTACHMENTS}</dt>
|
||||
<!-- BEGIN attachment -->
|
||||
<dd>{topic_review_row.attachment.DISPLAY_ATTACHMENT}</dd>
|
||||
<!-- END attachment -->
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
|
||||
<!-- IF topic_review_row.POSTER_QUOTE and topic_review_row.DECODED_MESSAGE -->
|
||||
<div id="message_{topic_review_row.POST_ID}" style="display: none;">{topic_review_row.DECODED_MESSAGE}</div>
|
||||
<!-- ENDIF -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END topic_review_row -->
|
||||
</div>
|
||||
|
||||
<hr />
|
||||
|
||||
<p>
|
||||
<a href="<!-- IF S_MCP_REPORT -->#report<!-- ELSE -->#postingbox<!-- ENDIF -->" class="top">
|
||||
<i class="icon fa-chevron-circle-up fa-fw icon-gray" aria-hidden="true"></i><span>{L_BACK_TO_TOP}</span>
|
||||
</a>
|
||||
</p>
|
7
public/styles/prosilver/template/profilefields/bool.html
Normal file
7
public/styles/prosilver/template/profilefields/bool.html
Normal file
|
@ -0,0 +1,7 @@
|
|||
<!-- BEGIN bool -->
|
||||
<!-- IF bool.FIELD_LENGTH eq 1 -->
|
||||
<!-- BEGIN options --><label for="{bool.FIELD_IDENT}_{bool.options.OPTION_ID}"><input type="radio" class="radio" name="{bool.FIELD_IDENT}" id="{bool.FIELD_IDENT}_{bool.options.OPTION_ID}" value="{bool.options.OPTION_ID}"{bool.options.CHECKED} /> {bool.options.VALUE}</label> <!-- END options -->
|
||||
<!-- ELSE -->
|
||||
<input type="checkbox" class="radio" name="{bool.FIELD_IDENT}" id="{bool.FIELD_IDENT}"<!-- IF bool.FIELD_VALUE --> checked="checked"<!-- ENDIF --> />
|
||||
<!-- ENDIF -->
|
||||
<!-- END bool -->
|
5
public/styles/prosilver/template/profilefields/date.html
Normal file
5
public/styles/prosilver/template/profilefields/date.html
Normal file
|
@ -0,0 +1,5 @@
|
|||
<!-- BEGIN date -->
|
||||
<label for="{date.FIELD_IDENT}_day">{L_DAY}{L_COLON} <select name="{date.FIELD_IDENT}_day" id="{date.FIELD_IDENT}_day">{date.S_DAY_OPTIONS}</select></label>
|
||||
<label for="{date.FIELD_IDENT}_month">{L_MONTH}{L_COLON} <select name="{date.FIELD_IDENT}_month" id="{date.FIELD_IDENT}_month">{date.S_MONTH_OPTIONS}</select></label>
|
||||
<label for="{date.FIELD_IDENT}_year">{L_YEAR}{L_COLON} <select name="{date.FIELD_IDENT}_year" id="{date.FIELD_IDENT}_year">{date.S_YEAR_OPTIONS}</select></label>
|
||||
<!-- END date -->
|
|
@ -0,0 +1,5 @@
|
|||
<!-- BEGIN dropdown -->
|
||||
<select name="{dropdown.FIELD_IDENT}" id="{dropdown.FIELD_IDENT}">
|
||||
<!-- BEGIN options --><option value="{dropdown.options.OPTION_ID}"{dropdown.options.SELECTED}>{dropdown.options.VALUE}</option><!-- END options -->
|
||||
</select>
|
||||
<!-- END dropdown -->
|
3
public/styles/prosilver/template/profilefields/int.html
Normal file
3
public/styles/prosilver/template/profilefields/int.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- BEGIN int -->
|
||||
<input type="number" min="{int.FIELD_MINLEN}" max="{int.FIELD_MAXLEN}" class="inputbox autowidth" name="{int.FIELD_IDENT}" id="{int.FIELD_IDENT}" size="{int.FIELD_LENGTH}" value="{int.FIELD_VALUE}" />
|
||||
<!-- END int -->
|
|
@ -0,0 +1,3 @@
|
|||
<!-- BEGIN string -->
|
||||
<input type="text" class="inputbox autowidth" name="{string.FIELD_IDENT}" id="{string.FIELD_IDENT}" size="{string.FIELD_LENGTH}" maxlength="{string.FIELD_MAXLEN}" value="{string.FIELD_VALUE}" />
|
||||
<!-- END string -->
|
3
public/styles/prosilver/template/profilefields/text.html
Normal file
3
public/styles/prosilver/template/profilefields/text.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- BEGIN text -->
|
||||
<textarea name="{text.FIELD_IDENT}" id="{text.FIELD_IDENT}" rows="{text.FIELD_ROWS}" cols="{text.FIELD_COLS}" class="inputbox">{text.FIELD_VALUE}</textarea>
|
||||
<!-- END text -->
|
3
public/styles/prosilver/template/profilefields/url.html
Normal file
3
public/styles/prosilver/template/profilefields/url.html
Normal file
|
@ -0,0 +1,3 @@
|
|||
<!-- BEGIN url -->
|
||||
<input type="url" class="inputbox autowidth" name="{url.FIELD_IDENT}" id="{url.FIELD_IDENT}" size="{url.FIELD_LENGTH}" maxlength="{url.FIELD_MAXLEN}" value="{url.FIELD_VALUE}" />
|
||||
<!-- END url -->
|
27
public/styles/prosilver/template/quickreply_editor.html
Normal file
27
public/styles/prosilver/template/quickreply_editor.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
<form method="post" action="{U_QR_ACTION}" id="qr_postform">
|
||||
<!-- EVENT quickreply_editor_panel_before -->
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
<h2 class="quickreply-title">{L_QUICKREPLY}</h2>
|
||||
<fieldset class="fields1">
|
||||
<!-- EVENT quickreply_editor_subject_before -->
|
||||
<dl style="clear: left;">
|
||||
<dt><label for="subject">{L_SUBJECT}{L_COLON}</label></dt>
|
||||
<dd><input type="text" name="subject" id="subject" size="45" maxlength="124" tabindex="2" value="{SUBJECT}" class="inputbox autowidth" /></dd>
|
||||
</dl>
|
||||
<!-- EVENT quickreply_editor_message_before -->
|
||||
<div id="message-box" class="message-box">
|
||||
<textarea style="height: 9em;" name="message" rows="7" cols="76" tabindex="3" class="inputbox"></textarea>
|
||||
</div>
|
||||
<!-- EVENT quickreply_editor_message_after -->
|
||||
</fieldset>
|
||||
<fieldset class="submit-buttons">
|
||||
{S_FORM_TOKEN}
|
||||
{QR_HIDDEN_FIELDS}
|
||||
<input type="submit" accesskey="f" tabindex="6" name="preview" value="{L_FULL_EDITOR}" class="button2" id="qr_full_editor" />
|
||||
<input type="submit" accesskey="s" tabindex="7" name="post" value="{L_SUBMIT}" class="button1" />
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
<!-- EVENT quickreply_editor_panel_after -->
|
||||
</form>
|
55
public/styles/prosilver/template/report_body.html
Normal file
55
public/styles/prosilver/template/report_body.html
Normal file
|
@ -0,0 +1,55 @@
|
|||
<!-- INCLUDE overall_header.html -->
|
||||
|
||||
<h2 class="titlespace"><!-- IF S_REPORT_POST -->{L_REPORT_POST}<!-- ELSE -->{L_REPORT_MESSAGE}<!-- ENDIF --></h2>
|
||||
|
||||
<form method="post" action="{S_REPORT_ACTION}" id="report">
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<p><!-- IF S_REPORT_POST -->{L_REPORT_POST_EXPLAIN}<!-- ELSE -->{L_REPORT_MESSAGE_EXPLAIN}<!-- ENDIF --></p>
|
||||
|
||||
<fieldset>
|
||||
<!-- IF ERROR --><dl><dd class="error">{ERROR}</dd></dl><!-- ENDIF -->
|
||||
<dl class="fields2">
|
||||
<dt><label for="reason_id">{L_REASON}{L_COLON}</label></dt>
|
||||
<dd><select name="reason_id" id="reason_id" class="full"><!-- BEGIN reason --><option value="{reason.ID}"<!-- IF reason.S_SELECTED --> selected="selected"<!-- ENDIF -->>{reason.DESCRIPTION}</option><!-- END reason --></select></dd>
|
||||
</dl>
|
||||
<!-- IF S_CAN_NOTIFY -->
|
||||
<dl class="fields2">
|
||||
<dt><label for="notify1">{L_REPORT_NOTIFY}{L_COLON}</label><br /><span>{L_REPORT_NOTIFY_EXPLAIN}</span></dt>
|
||||
<dd>
|
||||
<label for="notify1"><input type="radio" name="notify" id="notify1" value="1" <!-- IF not S_NOTIFY -->checked="checked"<!-- ENDIF --> /> {L_YES}</label>
|
||||
<label for="notify0"><input type="radio" name="notify" id="notify0" value="0" <!-- IF S_NOTIFY -->checked="checked"<!-- ENDIF --> /> {L_NO}</label>
|
||||
</dd>
|
||||
</dl>
|
||||
<!-- ENDIF -->
|
||||
<dl class="fields2">
|
||||
<dt><label for="report_text">{L_MORE_INFO}{L_COLON}</label><br /><span>{L_CAN_LEAVE_BLANK}</span></dt>
|
||||
<dd><textarea name="report_text" id="report_text" rows="10" cols="76" class="inputbox">{REPORT_TEXT}</textarea></dd>
|
||||
</dl>
|
||||
<!-- IF CAPTCHA_TEMPLATE -->
|
||||
<!-- INCLUDE {CAPTCHA_TEMPLATE} -->
|
||||
<!-- ENDIF -->
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel">
|
||||
<div class="inner">
|
||||
|
||||
<div class="content">
|
||||
<fieldset class="submit-buttons">
|
||||
<input type="submit" name="submit" class="button1" value="{L_SUBMIT}" />
|
||||
<input type="submit" name="cancel" class="button2" value="{L_CANCEL}" />
|
||||
{S_FORM_TOKEN}
|
||||
</fieldset>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<!-- INCLUDE overall_footer.html -->
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue