Commit Graph

320 Commits

Author SHA1 Message Date
Ralf Becker
08acad038c * Mail: replying to a mail should only update icon, not move it to top of list 2020-07-29 13:58:15 +02:00
Hadi Nategh
7900bfd9cd Avoid outputting same message multiple times if it's still alive 2020-07-24 12:46:29 +02:00
nathangray
6d2af76576 * Infolog: Push updates 2020-07-23 13:34:08 -06:00
nathangray
a6688ab3f8 Etemplate: Allow app to specify a new row index for updated rows as well. 2020-07-22 12:00:01 -06:00
nathangray
f0b924008b Etemplate: Add a callback so apps can decide where to put new push rows 2020-07-21 15:32:22 -06:00
nathangray
69420c19ad Api: Handle add push messages in the nextmatch list 2020-07-20 13:43:26 -06:00
Ralf Becker
bf44ee753a WIP push for mail (currently only Dovecot with further configuration!) 2020-07-20 12:09:08 +02:00
Hadi Nategh
1f066dee26 Implement new egw messaging (keeps not deliberately dismissed messages) 2020-07-17 14:09:37 +02:00
Ralf Becker
ab1e59c0df register and deregister old JavaScript based app objects with new TypeScript registry to receive observer and push calls 2020-07-15 19:15:54 +02:00
Ralf Becker
808313c121 set grants if given for push 2020-07-13 19:26:05 +02:00
nathangray
ce393e0803 Remove et2_types 2020-05-29 11:21:17 -06:00
nathangray
b5dceda99c Fix js packaging by switching from uglify-es to terser 2020-05-28 11:48:44 -06:00
Ralf Becker
588cd10043 track top EGroupware window in egw object to be used as egw.top instead of window.top, which can throw a security exception 2020-05-18 20:55:57 +02:00
nathangray
4cf185ce7e Avoid JS error by making sure we have a date format 2020-05-15 14:42:31 -06:00
nathangray
242d435252 Fix a few remaining usages of free(), which was removed as part of the TypeScript conversion 2020-05-15 09:50:38 -06:00
Ralf Becker
4dc120a6d2 making video position available and a couple of documentation updates 2020-05-10 14:53:06 +02:00
nathangray
7f99b750b0 Fix missing appname in check
(see 444babdbc8)
2020-04-29 11:28:17 -06:00
nathangray
444babdbc8 Api: Take care of private app.js instances, make sure they're included in iteration.
Iterate over all app.js instances (public & private) using:
for (var app_obj of window.EgwApp) {...}
2020-04-21 15:36:17 -06:00
Ralf Becker
9817d25a47 move who is available via push to push class and backends 2020-04-20 13:07:58 +02:00
Hadi Nategh
be7d045e1d Add requireInteraction option into notification class 2020-04-06 17:24:48 +02:00
nathangray
d24c6f2b7d Avoid error if extra parameter is not set 2020-03-31 10:21:26 -06:00
Ralf Becker
038c1c811c fix not closed spinner for application names with a dot 2020-03-31 13:03:31 +02:00
nathangray
7163acfe1d * Add action to share filemanager folder (readonly) with hidden upload folder 2020-03-24 20:34:04 -06:00
nathangray
34ec346821 Fix favourites (& probably some more inherited stuff) broken by TypeScript conversion
Note that any properties declared in a sub-class aren't generally available until after the super() call is done, i.e. in the super constructor they're undefined.
2020-03-20 11:38:38 -06:00
Hadi Nategh
d6c2a4aa0b Convert tracker app.js to TS 2020-03-09 16:12:49 +01:00
Hadi Nategh
0cc7ce12d0 merge master 2020-03-05 14:45:25 +01:00
Ralf Becker
65294a3e19 fix error on window closing in Chrome 80+
caused by Chrome 80+ no longer allowing to send a synchronious ajax request from beforeunload handler, using sendBeacon (async request with keepalive=true) instead
2020-03-02 10:43:19 +01:00
Hadi Nategh
2cc2f198d4 Some fixes for egw_action and egw_global 2020-02-28 14:41:17 +01:00
nathangray
b03e8d167e Update some parameter types 2020-02-27 11:44:34 -07:00
nathangray
49493a6af8 Convert etemplate2 to typescript 2020-02-24 15:16:40 -07:00
Ralf Becker
20a3dd9fd0 use super.<name>(<arguments>) instead of super.<name>.apply(this, arguments) 2020-02-12 10:37:29 +01:00
Ralf Becker
5f804dd661 use super.<name>(<arguments>) instead of super.<name>.apply(this, arguments) 2020-02-11 17:40:33 +01:00
Ralf Becker
d053a72a17 some fixes on the TS interface of client-side api and TS conversation tool 2020-02-10 10:02:04 +01:00
Ralf Becker
fc48878558 added (generated) TS declarations for egw_action 2020-02-10 10:00:35 +01:00
Ralf Becker
362063e542 added (generated) TS declarations for egw_action 2020-02-09 13:09:11 +01:00
Ralf Becker
8dd03e3d07 some fixes on the TS interface of client-side api and TS conversation tool 2020-02-09 12:27:39 +01:00
Hadi Nategh
d88854b467 Convert et2_widget_file, et2_widget_vfs and fixes couple of definitions in other widgets 2020-02-07 17:41:51 +01:00
Ralf Becker
025b2cc431 moving webserverUrl property to IegwGlobal interface from global egw object 2020-02-04 18:32:58 +01:00
Ralf Becker
8b2f04607e moving webserverUrl property to IegwGlobal interface from global egw object 2020-02-04 18:30:37 +01:00
Ralf Becker
2fc0666762 merged master into typescript 2020-02-03 15:16:51 +00:00
Ralf Becker
e0f38dfb94 migrated infolog app.js to typescript 2020-02-03 16:05:40 +01:00
Ralf Becker
3575f06501 fix JS error from cropper, stalling eTemplate with minified JS 2020-02-02 10:32:12 +01:00
nathangray
4eca12001a Mark some optional parameters 2020-01-31 09:25:11 -07:00
Hadi Nategh
ffae3f2e17 Remove all map files 2020-01-29 17:14:32 +01:00
Hadi Nategh
c8da07b460 Rebase onto Master 2020-01-29 15:31:57 +01:00
nathangray
812f6a0ef7 ts->js maps 2020-01-29 15:12:43 +01:00
Ralf Becker
8b3f9947e6 baseWidget in TS 2020-01-29 15:08:42 +01:00
Ralf Becker
a4ce103d7e WIP with TypeScript 2020-01-29 15:08:42 +01:00
Ralf Becker
9f574b4a38 some egw object interface changes and using it in app.ts base object 2020-01-27 13:43:13 +01:00
Ralf Becker
5b5c2a6cff full TypeScript Interface for client-side API 2020-01-26 13:58:10 +01:00
Ralf Becker
e9c4d3f07e complete push implementation for timesheet incl. ACL check 2020-01-24 13:31:56 +01:00
nathangray
76a5793a0a New push method, with base implementation of delete client side 2020-01-23 11:03:29 -07:00
nathangray
ff50df67d0 Use correct refresh methods for delete so app can handle it 2020-01-23 09:21:41 -07:00
Ralf Becker
6e0936bd98 first take on pushing app-changes to all clients 2020-01-23 11:26:44 +01:00
Ralf Becker
901825bcfa first try with TypeScript: timesheet app.js incl. new egw_app base-class 2020-01-23 09:14:58 +01:00
nathangray
b1c094ca47 ts->js maps 2020-01-22 02:04:45 -07:00
Ralf Becker
630797f127 baseWidget in TS 2020-01-21 12:22:41 +01:00
Ralf Becker
68f9d4c0cf WIP with TypeScript 2020-01-21 10:12:39 +01:00
Ralf Becker
8d5893d515 a couple of small fixes from the conversation to TypeScript 2020-01-15 08:52:49 +01:00
Ralf Becker
55ae9c1c7b first try with TypeScript: timesheet app.js incl. new egw_app base-class 2020-01-15 08:47:33 +01:00
Hadi Nategh
edd8be4355 * All apps favorites: fix issue add favorites popup dialog no longer works after add/remove columns from list 2019-11-13 11:50:30 +01:00
Ralf Becker
bf844b7598 support for new Swoole push server 2019-11-04 09:29:49 +01:00
nathangray
87501bb2a9 * Api: Fix bug where some links opened in the application's main tab instead of popups
Now keeping addressbook & projectmanager opening in main tab
2019-10-17 15:05:55 -06:00
Hadi Nategh
798823ab6e Make sure excluded mime types are type of string before splitting them, avoid js error "Uncaught typeError: ex_mime.split is not a function" 2019-10-02 13:52:48 +02:00
nathangray
2f1dfcc3d8 Calendar - Fix another case of group events not showing properly 2019-09-11 13:29:07 -06:00
nathangray
a49e3a3c15 Api - Add a Share filemanager directory context menu action 2019-08-22 15:18:40 -06:00
nathangray
890cd4e4a4 Api - give error if share path is missing 2019-07-31 10:31:13 -06:00
Ralf Becker
672c407804 egw.(de|en)codePath to correctly encode % and # 2019-03-21 12:46:22 +01:00
Hadi Nategh
2126fca1b4 * Api: Fix mobile template not working with iOS < 10 anymore (iOS < 10 is not compatible with JS ES6) 2019-03-18 16:22:39 +01:00
Hadi Nategh
72cad447b0 Do not check jsonp since we are not using it and it might cause errors by setting dataType to script falsely 2019-02-20 13:24:43 +01:00
Hadi Nategh
b16e93bfe3 Make sure we have a match before using it 2019-02-20 10:41:04 +01:00
nathangray
098fcbf918 Fix (remove) vertical scrollbar on popups with CKEDITOR 2019-01-23 16:01:50 -07:00
Ralf Becker
de27dd3ed3 fix only-send-changed-preferences check for objects
before preference values which are objects have been always send again
trying to fix "storm" of set_preference() calls by mail splitter
2019-01-22 10:10:24 +01:00
Ralf Becker
5531844c0d use correct window of includeJS and alert, also fixed in wrong order included first JS file 2019-01-15 14:34:52 +01:00
nathangray
0d75e05369 Fix accountData failed if a request for a different field is made while waiting for the server 2019-01-11 10:22:29 -07:00
nathangray
01dfdd9b1d Handle javascript as a link registry type target 2019-01-10 14:58:40 -07:00
nathangray
00ea499559 Calendar - open add into a dialog widget 2019-01-09 16:48:04 -07:00
nathangray
6892c4508e Keep a queue of callbacks for the same account and call them all back when we get it 2018-12-19 15:31:44 -07:00
nathangray
e089093b89 User data request has to be synchronous or we can get many identical requests 2018-12-12 16:37:48 -07:00
Ralf Becker
2f1333a116 return and show in browser JSON parsing errors maybe caused by network problems
server sends HTTP status "400 Bad Request" with JSON payload with "error" and "errno" attributes.
error is json_last_error_msg() prefixed with "JSON ".
Not yet implemented is resending the request (max. twice) for JSON parsing errors to try to work around network problems
2018-11-01 12:00:08 +01:00
Hadi Nategh
b39bcc8c36 Remove unintentional commited part from commit a9a303a 2018-10-19 14:59:20 +02:00
nathangray
117b559a5e Entry share changes
- Writable share is now a checkbox
- Add Sharing -> Merge entry into email template, share gets selected options
- Add {{share}} placeholder which creates (by default) read only share
2018-10-11 12:54:17 -06:00
Hadi Nategh
970fb80675 Respect async flag with set false value 2018-10-11 14:14:21 +02:00
Hadi Nategh
c3c887da98 Fix set_account_data turns into an infinite loop because of async ajax call 2018-10-09 17:41:38 +02:00
nathangray
c197d15a28 Explicitly set async to false for user list 2018-10-04 16:09:42 -06:00
nathangray
20956c4966 Explicitly set async to false for user list 2018-10-04 16:01:44 -06:00
Hadi Nategh
cceba01f87 Change default value for async json_request to true 2018-10-04 17:48:13 +02:00
Hadi Nategh
d022e555d5 Fix xhr url in Offline options 2018-10-02 10:12:40 +02:00
Hadi Nategh
54cafd15d7 Implement Online/Offline connection indicator 2018-10-01 15:54:42 +02:00
Hadi Nategh
08b9138ae6 Fix tutorials json feed and PGP Installation tutorial video 2018-08-23 14:54:37 +02:00
Hadi Nategh
36a6efe837 Fix missing translations for PGP Back/restore feature 2018-08-23 13:47:04 +02:00
Ralf Becker
bbe551d4cc sending appliction/json aka JSON as direct payload for all POST ajax requests
instead of additionally encoding them as form-data
2018-08-16 11:07:50 +02:00
Ralf Becker
5e7ef5386c allow additional "UPDATED" success message to keyring.importPublicKey 2018-08-14 11:33:28 +02:00
Hadi Nategh
73b6ab8128 IE 11 and below does not support ES6 syntax we need to use some polyfills 2018-08-10 10:31:40 +02:00
Ralf Becker
e53482289a fix not displayed requrested and comment 2018-08-03 15:38:34 +02:00
Hadi Nategh
a9a303a6ff Add new preference to control default action of editing a document (open with:Collabora|CollabEditor|Download) 2018-08-03 11:08:00 +02:00
Ralf Becker
250b56589c WIP allow to document admin actions, if EPL policy app is installed 2018-08-02 11:43:56 +02:00
Hadi Nategh
e9f4a72031 Do not add the loading prompt container if it's already there 2018-07-13 16:32:44 +02:00
Hadi Nategh
cc3e00f9f1 * Mail: take opened compose dialogs into account when trying to forward attachment, share files into mail or vcard attachment from addressbook 2018-07-11 14:39:40 +02:00
Hadi Nategh
03fd308d00 Remove comma from personal part since comma is preserved as address separator 2018-07-05 14:29:49 +02:00
Hadi Nategh
9317cdd216 Fix contacts with ampersands in their name will fail in mailto function 2018-07-05 11:28:12 +02:00
Hadi Nategh
ad913ff93d Do not push popup windows if we are in mobile framework 2018-06-29 10:05:28 +02:00
Hadi Nategh
ce52dd10ad * Addressbook: Inform the user about number of contacts adding to mail compose dialog via Email action 2018-06-07 14:45:42 +02:00
nathangray
0582f2347f Fix a few issues from Scrutinizer
- Remove debug code
- Remove some unused variables
- Add get_ui() to base class that gives error message (should always be a subclass)
2018-06-06 09:54:49 -06:00
nathangray
4a9df7ef33 Got link creation via context menu working 2018-06-05 14:31:04 -06:00
nathangray
d0a50d8d45 Changes needed to just get the screenshots, much more work needed for proper functionallity since I faked the permissions 2018-06-05 14:31:04 -06:00
Ralf Becker
430368eab9 new JSON response method "message" to call egw.message eg. in a popup, by using the context from the egw.json call 2018-06-05 12:29:51 +02:00
Hadi Nategh
5d128cc43b * Addressbook: Fix send all contact's emails/vcards to compose dialog does not work 2018-04-09 16:42:08 +02:00
Hadi Nategh
2d71cdf0f5 Fix tracking of opened popups not working after framework reload 2018-03-12 17:04:17 +01:00
Hadi Nategh
a8e10cdc64 WIP framework's popup storage/restore:
- Keep tracking of popup's window object and restore it when needed
- Implement a method to check an already opened popup and execute a method in the selected popup context
- Fix vcard import into opened compose windows not working
2018-03-09 17:48:09 +01:00
Hadi Nategh
7510a94e11 Add closing timer on notifications 2018-02-19 17:17:24 +01:00
Hadi Nategh
9c4b26f4fb Make sure the original link_registry values of filemanager-editor are not touched 2018-02-07 12:38:07 +01:00
Hadi Nategh
8e0243294c Implement proposed filemanager mime type open handler based on user preferences 2018-02-06 18:00:36 +01:00
Hadi Nategh
2bf7597647 Fix a bug notifications sidebar in client-side not being translated 2018-01-11 17:23:58 +01:00
Hadi Nategh
f42801236a Override the globalEval to mitigate potential execution of script tag 2017-10-27 17:42:44 +02:00
Hadi Nategh
f9aec1bf46 Take respective window object into account while building loading_prompt 2017-10-11 15:03:34 +02:00
Hadi Nategh
0ececf8c78 Set statustext value as text by default
- Introduce new boolean attribute called statustext_html in case we want
explicitly statustext gets rendered as html
- Fix Calendar tooltip with new statustext_html attribute
2017-09-05 19:04:45 +02:00
Hadi Nategh
163b6b6522 Give preferences popup bigger size plus show fulltext of selectboxes 2017-04-18 14:57:04 +02:00
Ralf Becker
e63cb7c849 same story tutorial popup: ignore security exception if window.top is in a different security context
eg. because SiteMgr contact-form is running in an iframe
2017-03-08 14:25:52 +01:00
Ralf Becker
f0925ef32c same story for framework: ignore security exception if window.top is in a different security context
eg. because SiteMgr contact-form is running in an iframe
2017-03-08 14:21:29 +01:00
Ralf Becker
d1b963c98b ignore security exception if window.top is in a different security context
eg. because SiteMgr contact-form is running in an iframe
2017-03-08 14:14:16 +01:00
nathangray
d0913cb309 Fix title & description in calendar events were not escaped 2017-03-01 10:52:38 -07:00
Hadi Nategh
e3bacb3565 * Mobile template: Fix "info message regarding fullscreen" does not respect the discard checkbox 2017-02-01 18:12:35 +01:00
nathangray
ceea2cb976 Some more code cleanup:
- Remove some unexecutable code
- Fix some variable declarations
(to satisfy Scrutenizer)
2017-01-31 08:29:00 -07:00
nathangray
017e45ffd4 Fix some missing / incorrect icons
- Addressbook advanced search was from default
- Add favorite dialog had no icons on buttons
- All dialogs using standard button sets were either missing or from default theme
- Mail confirm all was missing Yes icon
2016-10-27 09:04:47 -06:00
Hadi Nategh
84207e9a5a Keep the default behavior for opening tel-url and make call_popup felixable to be able to get target 2016-10-27 14:17:42 +02:00
Hadi Nategh
b59b44d29d Open phonecall window target as _self instead of new tab 2016-10-27 11:07:59 +02:00
Hadi Nategh
9d1fca0710 Make sure html property of html object in egw_seperateJavascript is type of string 2016-08-02 12:17:16 +02:00
Ralf Becker
96caf6effd * Admin/APC(u): fix error in clear cache: if APC(u) runs out of memory clearing just instance cache clear whole cache 2016-07-28 12:02:21 +02:00
Ralf Becker
58d2e49843 fix two more cases in which "show_generation_time" is queried and should never trigger a request to server, see 1c6c930312 2016-07-21 10:51:17 +02:00
Ralf Becker
45111b8cd9 if "common" prefs are not loaded, do not display page generation time
Before we queried page_generation_time common preference without a callback, which send a synchronious request to server to fetch common preferences, when it returned it looked for the preference again and send the next synchronious request to the server, in an infinit loop. Now setting _callback parameter of egw.preference() to false, just returns undefined, if common preferences are not yet loaded, but dont try to query them from server
2016-07-20 17:15:41 +02:00
Hadi Nategh
1fcbb03153 Evaluate show_generation_time preference value before calling for pageGenTime 2016-07-15 17:25:07 +02:00
Hadi Nategh
9d054b9437 Fix asyncIncludetime in genPageTime repeats itself into DOM instead of updating the value 2016-07-15 09:35:02 +02:00
Hadi Nategh
eba29d3541 Create DOM node for pageGenTime data 2016-07-14 17:21:51 +02:00
Hadi Nategh
b1e666245a Check and ask for the notification permission if nothing yet set 2016-07-11 12:24:59 +02:00
Hadi Nategh
f01d6bc404 Add a method to egw.notification to check API availability 2016-07-11 12:01:29 +02:00
nathangray
9b80a7d133 Fix favorite delete confirm dialog header was not translated 2016-07-07 10:19:13 -06:00
Hadi Nategh
e98bf91347 Take other objects (like sel_options) from arrayMgrs into account regarding feeding content to view template 2016-07-04 14:28:39 +02:00
Ralf Becker
82c4eecfa3 change wording of error message on server-side ajax requests 2016-06-28 20:40:11 +02:00
Hadi Nategh
14935780ce Fix PGP Encryption backup:
- Rename the backup file, still will check the previous backup file though
- Close backup dialog from mailvelope after the backup process is finished
2016-06-21 12:54:50 +02:00
Ralf Becker
f86c1934eb * PGP: using following (hidden) files in users home-directory: .PGP-Key-Backup and .PGP-Keychain 2016-06-20 15:13:37 +02:00
Ralf Becker
4cbe7dffa3 fix not working tail popup 2016-06-18 10:22:34 +02:00
Ralf Becker
d40a3aa34f revert jQuery.noConflict() stuff as current aproach fails if minified 2016-06-14 21:42:12 +02:00
Ralf Becker
7bb87c2615 stop jQuery from setting $ as early as possible and added more checks for calendar running in frameworked template 2016-06-14 21:17:46 +02:00
Ralf Becker
9d12c2a9a5 tell jQuery to remove $, as EGroupware does NOT use it and it conflicts with eg. mootools 2016-06-14 19:12:19 +02:00
Hadi Nategh
885ed833e1 Fix resources categories shown in iframe 2016-06-13 17:31:43 +02:00
Hadi Nategh
5e4412aea5 Run applications categories with ajax=true
- Fix categories colors not showing up
- Fix categories list refresh does not work
2016-06-13 12:30:21 +02:00
nathangray
9c7c53606a Still accept old style favorites on the client side, as they're still handled on the server side.
Better fix than previous handling
2016-06-09 12:37:30 -06:00
Hadi Nategh
feb09667ae Fix tutorial stops calendar sidebox from loading, happens only in FF 2016-06-09 17:40:16 +02:00
nathangray
dd0e541605 Still accept old style favorites on the client side, as they're still handled on the server side. 2016-06-08 11:48:14 -06:00
Hadi Nategh
93217a149d jQuery libraries updates via composer 2016-06-06 17:38:20 +02:00
Hadi Nategh
87fb94a496 Deprecate $j global variable and replace them all with standard jQuery 2016-06-02 16:52:01 +02:00
nathangray
a46f418fb6 Fix unwanted highlight matching when favorite had additional filters 2016-05-25 13:28:27 -06:00
Hadi Nategh
dea9c260b0 Deselect rows after return action from view template 2016-05-25 17:40:44 +02:00
Hadi Nategh
60bc400313 Fix modified view templates are not getting updated because of no cache-buster modification timestamp 2016-05-25 16:44:36 +02:00
nathangray
8dec95e4fc Remove highlight clicked favorite, it was conflicting with highlighting matching favorite if the clicked favorite was not valid for the results. 2016-05-24 16:27:27 -06:00
Ralf Becker
00b898bb2e fix tooltips for displaying lots of content 2016-05-07 16:56:18 +00:00
Ralf Becker
22b785c5a6 do not request translations empty or undefined app name from server 2016-05-05 09:23:06 +00:00
Ralf Becker
5353072052 mv template specific images from "phpgwapi" to "api" and search "api" also on client-side for image, added debug GET parameter to images.php to JSON pretty-print instead of one line javascript 2016-05-05 09:16:27 +00:00
Ralf Becker
4af0e7cb1c WIP EGroupware without phpgwapi&etemplate 2016-05-04 19:07:54 +00:00
Ralf Becker
760c8193fb fix image with name filter is not found, because empty vfs store returns empty array having a method filter, now we check that attribute is of type string 2016-05-04 13:57:26 +00:00
Hadi Nategh
d6d9a076ae Check Notification API is supported by browser before using it 2016-05-04 13:04:55 +00:00
Hadi Nategh
c6bda1524f Mobile theme:
- Replace 'Edit' caption in view template with an icon, makes it similar to other dialogs
2016-05-04 08:23:48 +00:00
Hadi Nategh
9d03e085ed Ask for notification permission only when it gets called 2016-05-04 08:12:51 +00:00
Ralf Becker
429177686a make home a regular application, which can eg. disabled, incl. moving all services using "home" as appname to "api" and moved some other forgotten stuff from phpgwapi&etemplate to api 2016-05-01 09:57:48 +00:00
Hadi Nategh
6260d948a7 Implement Web Notification API into egw_notification 2016-04-29 14:25:07 +00:00
Hadi Nategh
45e7536a8b Mobile theme:
- Fix back button state and a confirmation to logout action
2016-04-28 13:53:44 +00:00
Nathan Gray
ad4e9f6770 Translate week header in date picker 2016-04-27 22:31:05 +00:00
Ralf Becker
8325963b06 fixed ckeditor problems if minifying was switched off, caused by egw.js loaded twice, removed old file-name based workaround on client-side in favor of not requesting it from server-side 2016-04-08 10:38:44 +00:00
Ralf Becker
2e3bd32721 moving all - non ancient ;-) - js files to api/js 2016-04-07 10:38:05 +00:00