Compare commits

...

711 Commits

Author SHA1 Message Date
3bcf476c43 Fix weird interface behavior 2022-03-17 18:40:54 +01:00
0be6d33b34 Add support for banner expiration 2021-12-30 10:37:03 +01:00
1cb1ec2b3f Show banners 2021-12-30 10:23:47 +01:00
ebf6cf2fc3 Update year 2021-07-13 18:00:48 +02:00
6a0f72bc76 Fix conflict 2021-07-13 17:50:22 +02:00
285e9fe792 Fix issue 2021-04-21 19:14:01 +02:00
3d8307cd87 Improve display 2021-04-21 19:12:44 +02:00
03073cb6a4 Enable week view 2021-04-21 18:54:16 +02:00
22f7388967 Auto-refresh dates 2021-04-21 18:51:15 +02:00
ad37bdb121 Update 2021-04-21 18:49:43 +02:00
983f26fee5 Can remove events 2021-04-21 18:38:28 +02:00
f5557d81e0 Merging is working 2021-04-21 18:30:29 +02:00
bcfdb5ffee Start to merge entries 2021-04-21 18:27:42 +02:00
79b8b8bd3c Can refresh the list of events 2021-04-21 18:06:37 +02:00
d7779bd653 Can add events 2021-04-21 18:02:03 +02:00
1adf0fb872 Can delete day 2021-04-21 17:55:04 +02:00
5fec0aa24c Process dates 2021-04-21 17:49:47 +02:00
dac00ccf3a Update fullcalendar 2021-04-21 17:26:34 +02:00
5f9565d045 Start to show presence 2021-04-21 17:08:23 +02:00
5f5f27e79d Load users presence 2021-04-21 16:48:50 +02:00
8705fc6581 Show which groups are Forez groups 2021-04-18 14:51:22 +02:00
09df12759a Add new fields 2021-04-17 09:00:01 +02:00
079e3b7f1e Can update new settings 2021-04-16 15:20:44 +02:00
e710450983 Fix reset loop 2021-04-16 08:00:01 +02:00
437b4cba1b Enforce first name & last name policies 2021-04-16 07:54:03 +02:00
fd03975508 Simplify box 2021-04-11 14:06:34 +02:00
b5a942bf0c Take account of new settings 2021-04-11 14:02:17 +02:00
4d05913819 Rename variable 2021-04-11 13:52:18 +02:00
8f8fd3151c Send a request to update notifications settings 2021-04-10 20:38:00 +02:00
5373eac5df Created template 2021-04-10 19:42:03 +02:00
b99c1e4a7f Better integration of groups conversations 2021-04-05 17:08:59 +02:00
0479a4d7a5 Update sidebar 2021-04-05 16:35:43 +02:00
f13a60ef90 Improve the way group conversations are shown in sidebar 2021-04-05 16:29:46 +02:00
2077538db8 Fix dark theme on group conversations 2021-04-05 16:11:30 +02:00
80b969c559 Display conversations correctly 2021-04-05 16:08:03 +02:00
20efa81a29 Fix conversations width 2021-04-05 16:03:35 +02:00
5bb7b2a39e Start to display group conversation page 2021-04-05 15:49:21 +02:00
5073c4e1ba Can change group conversations visibility 2021-04-05 15:27:56 +02:00
2fb3c7e789 Can delete a group conversation 2021-04-05 15:16:37 +02:00
ac2ba87f18 Can create conversations for groups 2021-04-05 14:59:57 +02:00
07fc609694 Show the list of members of the group, if it is public 2021-03-17 18:40:11 +01:00
0965b0936b Fix bug 2021-03-17 18:33:25 +01:00
fc2b7e082c Can update members list public settings 2021-03-17 18:16:39 +01:00
f98daa4291 Update 2021-03-16 18:54:57 +01:00
ca7301e258 Fix dark theme for groups page 2021-03-16 17:22:51 +01:00
e786c19982 Create about page 2021-03-16 17:04:34 +01:00
5c9d56208c Populate about page 2021-03-16 16:57:15 +01:00
abed0b7513 Ready to implement about page 2021-03-15 19:19:58 +01:00
c4aced5ed2 Improve settings tab 2021-03-15 19:00:03 +01:00
d8bce9fc57 Start to update group settings page 2021-03-15 18:54:34 +01:00
d4865846a7 Make members page accessible 2021-03-15 18:38:59 +01:00
1067b577fd Improve tabs appearance 2021-03-15 18:30:18 +01:00
9d1ebf5899 Create group tabs 2021-03-15 18:04:20 +01:00
d0812e2d85 Can respond to group invitation from sidebar 2021-03-15 16:43:40 +01:00
d61d8d977c Fix build script 2021-03-14 14:43:53 +01:00
1c2e8766a6 Move color picker images 2021-03-14 14:42:29 +01:00
54d8245f91 Handle conversation deleted event 2021-03-13 13:39:03 +01:00
0a5a2637f5 Fix white theme issue 2021-03-13 08:47:45 +01:00
2d9734a1ff Simplify variables name 2021-03-12 16:10:32 +01:00
7681a78dc7 Update convesations policy 2021-03-12 16:07:16 +01:00
ff499f9892 Fix the way conversations are created 2021-03-09 18:59:15 +01:00
339315395d Improve images appearance 2021-03-09 17:18:19 +01:00
bebfdd7d35 Fix bad picture appearance 2021-03-09 17:08:32 +01:00
b8be70f6dc Add a feedback when uploading a file 2021-03-09 17:06:35 +01:00
b614f649e3 Show in live who is writing 2021-03-09 07:47:36 +01:00
3a55f18b96 Ready to implement conversation message writing notifier 2021-03-08 19:01:51 +01:00
a545860795 Update route name 2021-03-08 18:16:45 +01:00
ffb6398fbb Send notification when user is writing a message 2021-03-08 18:09:56 +01:00
f938fd7850 Add the list of groups of the user 2021-03-08 17:35:59 +01:00
8db5dee1c9 Get groups logos 2021-03-08 17:24:27 +01:00
35d1e6a8b1 Block HTML content in posts content 2021-03-08 17:19:26 +01:00
30353c5277 Update all conversation messages screen 2021-03-08 17:16:29 +01:00
349b66939c Update conversations tab 2021-03-08 17:08:00 +01:00
9f98a2efd9 Export conversations logo 2021-03-08 16:43:37 +01:00
824759627f Remove background from exported data 2021-03-08 16:34:45 +01:00
651bfb4e8d Update personal data downloader 2021-03-08 16:31:47 +01:00
45db26bbd5 Do not reopen calls on page reload anymore 2021-03-08 13:09:50 +01:00
2e1dc48671 Auto-close conversation chat on user removal 2021-03-07 19:49:34 +01:00
ce0397d5be Redirect user when he is removed from conversation 2021-03-07 19:44:51 +01:00
865a123897 Avoid the presence of multiple phone buttons 2021-03-07 19:40:16 +01:00
ca7768c8a7 Show conversation logo on sidebar 2021-03-07 15:35:50 +01:00
4fdb74d9d0 Show current conversation image 2021-03-07 15:33:29 +01:00
298c251e2f Request to delete conversation image 2021-03-07 15:25:18 +01:00
255f3b0595 Can change conversation image 2021-03-07 14:55:00 +01:00
d425734810 Apply conversations color 2021-03-07 14:36:17 +01:00
9dbbf0eb5f Can leave / delete a conversation 2021-03-07 14:28:38 +01:00
506a0a7d38 Fix issue when renaming conversation 2021-03-07 14:12:47 +01:00
bed93d5a19 Fix bad values 2021-03-07 14:09:36 +01:00
98906334a7 Can update conversation color 2021-03-07 14:08:01 +01:00
e32f114179 Ready to apply color to conversations 2021-03-06 19:24:46 +01:00
cc4518b4d6 Apply color style 2021-03-06 19:20:57 +01:00
abae3639c2 Index primary color 2021-03-06 19:16:02 +01:00
63365e7db7 Fix bad function 2021-03-06 19:10:59 +01:00
04c7d31f12 Improve file size 2021-03-06 19:09:54 +01:00
dd2c8ea707 Handle error 2021-03-06 19:07:51 +01:00
ed850258d4 Fix bad check 2021-03-06 19:06:40 +01:00
83580fd627 Fix null issue 2021-03-06 19:03:25 +01:00
5056b07ddf Update 2021-03-06 18:54:50 +01:00
7b430107e3 Start to update conversation settings screen 2021-03-06 18:41:42 +01:00
eb76a1491a Can toggle admin status of a user 2021-03-06 18:15:21 +01:00
a6fa3d7ac6 Remove user from conversation 2021-03-06 18:05:53 +01:00
cbfad9ad87 Fix bad refresh 2021-03-06 17:58:20 +01:00
d33484a476 Can add again members to conversations 2021-03-06 17:43:27 +01:00
cad16967b7 Update 2021-03-06 15:17:57 +01:00
11d400e110 Fix call system 2021-03-06 15:15:03 +01:00
b45d4eaadd Increase max messages length 2021-03-06 15:10:49 +01:00
82a6dcb65b Support all files types in chat box 2021-03-06 15:09:36 +01:00
5c6276d11a Can send file from chat box 2021-03-06 15:06:54 +01:00
b44755b91e searchPrivate 2021-03-06 15:04:10 +01:00
4a02338d38 Fix message updated event 2021-03-06 14:53:55 +01:00
417b8a6600 Can request message content update 2021-03-06 14:52:35 +01:00
ba2c21bf54 Can delete again messages 2021-03-06 14:49:45 +01:00
92a8c90c1f Can delete again messages 2021-03-06 14:37:59 +01:00
20fedca62d Can send again text message from conversation box 2021-03-06 14:37:18 +01:00
4f85e42295 Handle new messages 2021-03-06 14:30:24 +01:00
3d503e1560 Can get older messages 2021-03-06 14:29:15 +01:00
538112d767 Handle server messages 2021-03-06 14:25:41 +01:00
e5f91e6ab2 Handle the messages of people who left the conversation 2021-03-06 14:09:19 +01:00
d3f6c293e1 Fix time sent 2021-03-06 14:07:20 +01:00
3f5d9fc466 Start to update conversations pane 2021-03-06 12:04:01 +01:00
152530a87e Show dark startup splash screen 2021-03-06 11:23:17 +01:00
b63ace2dde Add video player 2021-03-06 11:19:17 +01:00
ee14bcb659 Add audio player 2021-03-06 11:09:59 +01:00
e89906a640 Can send files to conversations 2021-03-06 10:35:54 +01:00
c9ddb6f172 Update 2021-03-05 17:55:26 +01:00
90e333baf0 Register correctly to events 2021-03-05 17:52:58 +01:00
ff4d5ae344 Upgrade conversation page 2021-03-05 17:49:51 +01:00
6dab962349 Fix conversation lists 2021-03-05 15:41:31 +01:00
136db55703 Upgrade user memberships pane 2021-03-05 15:26:45 +01:00
f3c3e9420d Update unread conversations dropdown 2021-03-05 14:37:22 +01:00
98352c1c50 Prepare head message of privacy policy settings page for translation 2021-02-20 11:25:53 +01:00
93ef106499 Retrieve privacy policy URL from static configuration 2021-02-20 11:23:54 +01:00
7ace4fb147 Use terms URL provided by server configuration 2021-02-20 11:17:24 +01:00
ceaf5edc8b Add link to Android application 2021-02-20 11:13:42 +01:00
f5e0629b3e Simplify access to bottom links 2021-02-20 11:07:41 +01:00
515e254ad9 Remove useless server configuration loads 2021-02-20 11:03:54 +01:00
2ad220b51f Make server configuration mandatory to load the page 2021-02-20 11:01:26 +01:00
3f8dbb3f36 Update startup sequence 2021-02-20 10:58:28 +01:00
69092db808 Simplify calls 2021-02-20 10:53:21 +01:00
0f597f8212 Improve password check 2021-02-17 18:49:07 +01:00
28fb38bf0c Move function to a more logical location 2021-02-17 18:38:04 +01:00
5dfe327f8c Load mail address to change password in settings 2021-02-17 18:35:28 +01:00
5e76b2b3f6 Improve message 2021-02-17 18:24:19 +01:00
82f6bc009c Upgrade change password form 2021-02-17 18:22:43 +01:00
035546d320 Use new password input to reset password 2021-02-17 18:15:17 +01:00
0a6dd75a05 Apply password policy on sign up screen 2021-02-17 18:07:55 +01:00
19cfb4760f Fix bad string 2021-02-16 19:37:01 +01:00
73fb50f8ca Can update privacy settings 2021-02-16 18:23:59 +01:00
bb81512f2c Start to build data conservation policy settings 2021-02-16 18:00:26 +01:00
562293a2e0 Fix reload issue 2021-02-14 19:29:29 +01:00
5011d3e6ff Improved build script 2021-02-13 17:04:35 +01:00
72e93fbc6c Improve tokens management 2021-02-13 15:43:58 +01:00
568239b6f5 Upgrade API system 2021-02-13 15:34:37 +01:00
f0f8d3cb71 serviceName 2021-02-13 15:33:17 +01:00
77b6c4d2f3 Update logout page 2021-02-13 15:28:48 +01:00
7c3946f376 Improve bad token handling 2021-02-13 15:23:43 +01:00
9dfe0e39eb Update login page 2021-02-13 15:14:45 +01:00
75f926d0c6 Fix missing variable 2021-02-13 12:00:49 +01:00
f45666c72d Deprecate movies system 2021-02-13 11:20:54 +01:00
37e90f1c18 Add timestamp to builds 2021-02-12 17:06:26 +01:00
d87e29d460 Fix bug in Firefox 2021-02-12 16:57:49 +01:00
76ff8565e4 Fix posts width on user page with large screens 2021-02-05 10:14:25 +01:00
be98575dea Update build script 2021-01-31 05:56:09 +01:00
c950b4d28e Dynamically load TensorFlow JS 2021-01-31 05:53:35 +01:00
155dc45906 Copy tensorflow models 2021-01-31 05:40:48 +01:00
a653eab59d Limit the number of time we check if the user is talking or not 2021-01-31 05:38:02 +01:00
576a7779ed Show message to enable background blur each time 2021-01-31 05:33:01 +01:00
00f82fce76 Do not proxy streaming images by default 2021-01-31 05:29:49 +01:00
4830a8cef9 Show notification in case of error 2021-01-30 20:28:29 +01:00
d06cca34d4 Enforce constraints 2021-01-30 20:23:55 +01:00
3724bad03f Improve framerate definition 2021-01-30 20:16:50 +01:00
120844bab0 Make TensorFlow completely available locally 2021-01-30 20:14:51 +01:00
9bee589dc4 Load background detection network only when required 2021-01-30 20:08:27 +01:00
08091425f1 Can toggle background blur 2021-01-30 19:44:39 +01:00
2e486b9b7c Update 2021-01-30 19:24:08 +01:00
7df6e5b3bf Improve script 2021-01-30 19:21:39 +01:00
cc3bdd1b0a Start to blur video background 2021-01-30 19:13:21 +01:00
7453018a5c Highlight videos where the person is talking too 2021-01-23 21:05:33 +01:00
efb664beb7 Prevent echo 2021-01-23 21:00:41 +01:00
e5c4a87a4f Highlight talking user 2021-01-23 20:56:07 +01:00
393da5beaf Fix null issue 2021-01-23 20:48:33 +01:00
476af0e3de Auto-release ressources 2021-01-23 20:46:31 +01:00
7bbd7f9dcf Start to detect when someone is talking in a conversation 2021-01-23 19:06:54 +01:00
066eab92f5 Add current user to the list of connected peers 2021-01-23 18:39:26 +01:00
6086096bae Fix typo 2021-01-19 17:56:20 +01:00
b2bb704b10 Fix bad routes 2020-05-18 13:18:58 +02:00
4f417e1299 Fix bad call 2020-05-17 19:22:59 +02:00
cc0d405de8 Can create a new choice for a survey 2020-05-17 19:22:04 +02:00
237b40afab Block creation of new choices 2020-05-17 18:43:41 +02:00
9777a2a370 Add new setting when creating survey 2020-05-17 18:12:02 +02:00
1ccb3eb36d Prepare for future translation of the application 2020-05-17 15:59:43 +02:00
fc7c920a70 Use real date 2020-05-08 11:16:11 +02:00
03153ea474 Fix conditions 2020-05-08 11:15:46 +02:00
22cb2673a4 Change to real date 2020-05-08 11:12:06 +02:00
93ff4e9049 Can force message to appear 2020-05-08 11:10:17 +02:00
e5db80c2c6 Add clippy.js to builds 2020-05-08 11:08:53 +02:00
22534536a4 Switch to https 2020-05-08 11:05:16 +02:00
8bbf55c7ed Easter egg special Manon 2020-05-08 10:56:05 +02:00
4c92f3398d Manon's special easter egg 2020-05-04 20:43:49 +02:00
2cc5539608 Block timer when it reach the end 2020-05-04 20:16:04 +02:00
0b87363d60 Auto-stop recording when closing calls 2020-05-04 13:32:04 +02:00
f91e053110 Block access to settings page to signed out users 2020-05-04 13:25:12 +02:00
a7a33bbdb8 Can sign out from all connected devices 2020-05-04 13:21:58 +02:00
f3b7091332 Add a little delay before marking peer as ready 2020-05-03 20:26:52 +02:00
58e9130b4f Add missing information in User object 2020-05-03 14:10:53 +02:00
b29935bbcf Fix typos 2020-04-29 17:01:59 +02:00
5007d4779f Fix shortcut typo 2020-04-29 17:01:26 +02:00
d8478fa7ad Fix typo 2020-04-29 13:52:54 +02:00
4749374702 Add "allowEveryoneToAddMembers" settings when creating a conversation 2020-04-26 14:41:09 +02:00
9bb9ff6153 Update conversation members 2020-04-25 18:44:40 +02:00
1f35b02326 Simplify code 2020-04-25 18:39:01 +02:00
00f0bf2f73 Automatically update checkbox 2020-04-25 18:24:47 +02:00
95411483c3 Add new canEveryoneAddMembers setting 2020-04-25 18:20:29 +02:00
2bd844e434 Fix issue 2020-04-19 14:51:17 +02:00
825d4a5128 Fix bad check 2020-04-18 12:06:13 +02:00
9b16f83693 Can delete movie 2020-04-18 12:04:49 +02:00
a34d10619c Auto-show the message when required 2020-04-14 19:18:19 +02:00
4260924ae0 Show a notice to help to start calls 2020-04-14 19:06:15 +02:00
34b182b35b Reindent lines 2020-04-14 18:31:12 +02:00
346d1eb79b Fix an issue in responsive mode 2020-04-14 18:30:10 +02:00
2c639df21b Can switch to full screen by double clicking on videos 2020-04-14 18:27:30 +02:00
6fa34d8896 Add call counter 2020-04-14 18:20:37 +02:00
fe4e659b08 Fix Safari bug 2020-04-14 18:03:49 +02:00
58c73b3108 Fix layout issue 2020-04-14 11:59:34 +02:00
b82cba518d Handles remote peer streams interruption 2020-04-14 09:48:30 +02:00
04812e21bb Notify of streaming interruptions 2020-04-14 09:20:57 +02:00
778b20ee33 Fix Chrome issue 2020-04-14 08:47:47 +02:00
d4c2152ecd Move record label 2020-04-14 08:29:11 +02:00
1de48a20a1 Can stop streaming 2020-04-13 19:12:43 +02:00
74a05fbdde Add a notice when recording 2020-04-13 19:07:12 +02:00
bc3bdeec05 Fix issue on audio calls 2020-04-13 18:49:02 +02:00
e27797cdcd Add recording support 2020-04-13 18:47:28 +02:00
e4478beda2 Keep track of remote streams 2020-04-13 18:22:18 +02:00
24218cf1e1 Fix connection issues 2020-04-13 16:58:43 +02:00
3fe8b2f438 Can switch from screen to webcam 2020-04-13 16:54:07 +02:00
ce89facd2d Improve method 2020-04-13 16:51:09 +02:00
40ef78acc6 Start to request screen sharing 2020-04-13 16:48:58 +02:00
d297bf92d0 Create submenu 2020-04-13 16:30:13 +02:00
92989a6341 Remove background from call window bottom 2020-04-13 14:56:30 +02:00
d4260ee4c2 Make call window title unselectable 2020-04-13 14:55:22 +02:00
34be87c096 Notify calls in sidebar 2020-04-13 14:51:22 +02:00
d6c9321024 Simple audio-only conversation boxes 2020-04-13 14:27:11 +02:00
cdbf0d22d5 Improve margins 2020-04-13 14:23:52 +02:00
65d1017aed Release ressources whenever it is possible 2020-04-13 14:22:20 +02:00
a4f5228037 Improve support of audio-only calls 2020-04-13 12:11:38 +02:00
088cbe77b9 Improve window size 2020-04-13 12:04:51 +02:00
b2b93ecbb8 Add call button on conversation page 2020-04-13 11:59:28 +02:00
c18b36bcdc Fix scroll issue 2020-04-13 11:52:14 +02:00
8d7cb37003 Fix scrolling 2020-04-13 11:37:26 +02:00
2cb9566c66 Auto scroll 2020-04-13 11:34:02 +02:00
b1dd0d1dd4 Start to anchor video calls 2020-04-13 11:18:04 +02:00
3961e79491 Invert condition 2020-04-13 10:31:21 +02:00
2429ea2ad8 Can toggle camera visibility 2020-04-13 10:25:39 +02:00
4095ae5653 Apply user name as title on video streams 2020-04-13 10:11:38 +02:00
c4e81d1ded Release user media 2020-04-13 10:05:21 +02:00
67e38faac9 Fix issue with audio stream 2020-04-13 09:47:21 +02:00
cef4925c66 Fix Chrome issue 2020-04-13 09:39:10 +02:00
4f56ff4121 Fix fullscreen size 2020-04-13 09:35:09 +02:00
a4d7eb9903 Improve videos appearance 2020-04-13 09:26:15 +02:00
14c85b194e Apply constraints on framerate 2020-04-13 08:59:11 +02:00
cff2cdada2 Add support for call closed event 2020-04-13 08:46:39 +02:00
dbf30acd19 Do not start streaming by default 2020-04-13 08:41:23 +02:00
8263aacdf3 Add full screen support 2020-04-12 19:02:09 +02:00
88aa8e52d5 Add responsive rules 2020-04-12 18:57:56 +02:00
9477bba0be Add hang up button 2020-04-12 18:52:56 +02:00
dd40c0fae3 Avoid an error 2020-04-12 18:41:42 +02:00
106744c7d8 Add property to window 2020-04-12 18:38:41 +02:00
a36d8b546a Improve CSS 2020-04-12 18:36:40 +02:00
8493d56993 Invert two code blocks (issue on green state of peer name) 2020-04-12 18:07:26 +02:00
95d2540cb4 Update 2020-04-12 18:06:29 +02:00
143e0a0c87 Apply video policy 2020-04-12 17:45:10 +02:00
3b2c533233 Improve CSS rules 2020-04-12 17:40:50 +02:00
c022187c02 Rename variable 2020-04-12 17:10:44 +02:00
a1efa39654 Fix issue on page reload 2020-04-12 16:16:42 +02:00
9deba36bcd Handle peers connection close 2020-04-12 15:31:32 +02:00
a5061dd7ef Fix candidates format 2020-04-12 15:23:46 +02:00
0efd15deaa Can request offers 2020-04-11 18:21:20 +02:00
3ec29e534d Destroy useless peer connections 2020-04-11 18:03:18 +02:00
5d7f7fc779 Display remote stream video 2020-04-11 16:37:50 +02:00
e4771ef361 First stream works 2020-04-11 16:34:05 +02:00
7b3e3af2cf Ready to connect to remote peer 2020-04-11 14:59:48 +02:00
59cd9e0fb4 Rady to connect to other peers 2020-04-11 14:50:37 +02:00
8febe2a523 Mark call as ready as soon as possible 2020-04-11 14:30:16 +02:00
fd95411045 Upgrade method 2020-04-11 14:28:37 +02:00
c840193007 Display local peer video 2020-04-11 14:18:27 +02:00
dea30cb0ce Handles remote signals 2020-04-11 14:05:29 +02:00
f3ae21c5c1 Display errors 2020-04-11 09:43:27 +02:00
ca5dd4b34c Start to send signals 2020-04-11 09:13:54 +02:00
3bda79cc8b Fix error for disconnected users 2020-04-11 08:50:46 +02:00
9e4ca58274 Switch to HTTPS 2020-04-11 08:49:43 +02:00
5598efa99c Improve the way calls are automatically reopened 2020-04-11 08:17:51 +02:00
e46f8a36a7 Automatically update the list of members of the call 2020-04-10 17:09:40 +02:00
40c895870f Start to show call members 2020-04-10 16:55:31 +02:00
22a19e0a32 Improve auto-completion 2020-04-10 16:54:45 +02:00
022f38f8e3 Reopen conversation on page reload 2020-04-10 16:15:52 +02:00
f3466a98e0 Notify server when joining call 2020-04-10 16:07:05 +02:00
51dcef4565 Update simplepeer 2020-04-10 14:23:36 +02:00
ade339bf1b Made the window draggable 2020-04-10 14:03:28 +02:00
f1399d2aef Improve window UI 2020-04-10 13:57:43 +02:00
c3226a4fe1 Automatically reoopen conversations on page reload 2020-04-10 13:51:36 +02:00
119a6f1626 Create base call window 2020-04-10 13:18:26 +02:00
a59b9b6441 Ready to implement call system 2020-04-10 11:24:46 +02:00
c8d0fc3186 Remove old call system 2020-04-10 11:17:10 +02:00
8dc337a00c Remove label from sidebar 2020-04-09 12:02:46 +02:00
de8a598f8c Improve conversations UI 2020-04-09 11:47:05 +02:00
9502a1d9dc Update conversations page 2020-04-09 11:36:32 +02:00
1596fda533 Add virtual directory support for sidebar 2020-04-09 09:25:58 +02:00
01d244386f Hightlight groups & friends 2020-04-09 09:19:03 +02:00
1e60114af3 Highlight active conversation 2020-04-09 09:15:04 +02:00
efa42b0922 Sidebar button works 2020-04-09 08:58:41 +02:00
20cd132e90 Display conversations in the sidebar 2020-04-09 08:57:22 +02:00
b07ae2ee39 Start to upgrade memberships sidebar 2020-04-09 08:45:03 +02:00
c5965b5a79 Recreate form automatically 2020-04-03 20:32:47 +02:00
b0e5acc92c Parser supports custom emojis 2020-04-03 20:26:34 +02:00
8d6adb336c "Forward" user information to emoji parser 2020-04-03 19:38:21 +02:00
527f0a838c Can request to delete an emoji 2020-04-03 18:43:23 +02:00
d717b6f2f7 Can upload custom emoji 2020-04-03 18:32:11 +02:00
61859e79dd Improve message 2020-04-03 18:02:43 +02:00
46643e6303 Display the list of emojies of the user 2020-04-03 18:01:53 +02:00
3833e46ba8 Propagate message deletion to conversations page 2020-04-03 09:09:17 +02:00
a6ca315a37 Propagate conversation message to chat window 2020-04-03 09:04:41 +02:00
3b0c696bed Add support for conversation messages update on conversation page 2020-04-03 08:42:56 +02:00
3ce0eeb509 Connect to message update events 2020-04-02 19:30:11 +02:00
e6cdcd8ed8 Prepare file for improvments 2020-04-02 19:13:10 +02:00
ac85cd4e6e Delete comments using websocket help 2020-04-02 18:31:41 +02:00
96ed7a47b8 Register to comments updateds events 2020-04-02 11:08:33 +02:00
0344ca5ca9 Give new comments through WebSocket 2020-04-01 19:06:57 +02:00
589b96d8bb Can easily get information about a single user 2020-04-01 19:05:31 +02:00
f3cf290822 Auto-register posts for updates 2020-04-01 18:45:29 +02:00
27d7c526b8 Update conversation page to use websockets 2020-04-01 15:10:03 +02:00
6eaea7cc1e Log ws messages 2020-04-01 14:30:04 +02:00
6f4e543876 Returns the message 2020-04-01 14:19:56 +02:00
11b11ff289 Start to migrate conversation system 2020-04-01 14:14:08 +02:00
ad7dcacb33 Add fallback for unsupported kind of messages 2020-04-01 11:28:13 +02:00
7f0d723e69 Propagate incognito status change to server 2020-04-01 10:51:07 +02:00
321a91910f Block page loading while WebSocket is not connected 2020-04-01 10:23:45 +02:00
5eee376136 Update likes through websocket request 2020-03-31 16:41:23 +02:00
7935f8a3ce Add websocket shorcut 2020-03-31 16:27:41 +02:00
e286c6fa85 Can send WebSocket requests to server 2020-03-31 16:25:05 +02:00
8773d203da Fix bad check 2020-03-31 11:40:16 +02:00
a71c3f8a73 Start to process websocket messages 2020-03-31 11:38:09 +02:00
ba3dd74756 Refactor notifications service 2020-03-31 11:14:44 +02:00
1f4c4f595c Reset instead of restarting 2020-03-31 10:44:54 +02:00
89519e2a62 Update sleep time before refresh 2020-03-31 10:40:04 +02:00
7b20cd9666 Remove deprecated interval 2020-03-30 14:56:01 +02:00
45b2bcda9c Receive messages from server 2020-03-30 14:52:43 +02:00
4c5a608531 Reload page only if WebSocket was not gracefully closed 2020-03-30 14:24:45 +02:00
7d9b035e57 Automatically reload page when WebSocket connection is closed 2020-03-30 13:48:40 +02:00
98c2f53a3a Fix URL 2020-03-29 18:40:51 +02:00
d241c94d46 Connect to websocket 2020-03-29 18:32:05 +02:00
a027e96071 Ready to implement WebSocket 2020-03-29 18:04:50 +02:00
99aafe3799 Switch to new API 2020-03-29 17:54:19 +02:00
fa923d33e8 Add communiquons.org build config 2019-12-24 11:03:26 +01:00
29cae38650 Fix typo 2019-11-01 15:40:43 +01:00
e57c2b9461 Disable builder 2019-07-24 12:59:33 +02:00
acb49a2070 Fix dark them issue with new post target picker 2019-05-19 17:18:28 +02:00
67b3e4414d Create post target picker 2019-05-19 17:16:18 +02:00
dacab00ae4 Create a new way to retrieve multiple groups information 2019-05-19 16:43:54 +02:00
d1c339c414 Create new users management system. 2019-05-19 16:30:20 +02:00
239bfe896e Can make API requests with promises 2019-05-19 15:56:44 +02:00
f815ea4fd4 Add create posts form on newest posts page 2019-05-19 14:59:36 +02:00
07b16c2f7e Made URL change check less ressources taking 2019-05-18 18:28:08 +02:00
f600f082f2 Fix margin issue with search results 2019-05-18 18:08:08 +02:00
d19a31cb95 Adapt dark theme to sidebar search input 2019-05-18 18:07:51 +02:00
21cf551fe9 Get faster results on search form of sidebar 2019-05-18 18:00:34 +02:00
12ce712263 Made user page larger 2019-05-18 17:57:49 +02:00
3898caa12c Add instant results on search form of side bar 2019-05-18 17:57:42 +02:00
a3650e3cda Fix issue with sidebar 2019-05-18 16:50:53 +02:00
9be0b616d6 Fix space issue 2019-05-16 19:09:33 +02:00
49e7b7e8ab Can open private conversation from sidebar 2019-05-16 19:06:58 +02:00
5cf82b3cfb Fix overflow issue on sidebar 2019-05-16 18:56:45 +02:00
9f408509d1 Automatically refresh sidebar 2019-05-16 18:49:00 +02:00
cd24434414 Fix issue that prevented to open user page when clicking on his name on sidebar 2019-05-16 18:41:59 +02:00
cd8280ae01 Improved connection between big and small conversation windows 2019-05-16 18:40:39 +02:00
30743601a9 Determine whether user is signed in or not on sidebar 2019-05-16 18:26:35 +02:00
18f7fbc304 Can respond to friendship requests from friends bar 2019-05-16 18:24:02 +02:00
1162ac7b89 Removed old friends bar 2019-05-16 18:14:02 +02:00
d7e732457d Show group basic information 2019-05-16 18:05:21 +02:00
a2d444bdb0 Appearance improvments 2019-05-16 17:38:10 +02:00
8ac1aaafdb Sidebar can remains closed on page change 2019-05-16 17:24:23 +02:00
949e9accdd Display friends and groups 2019-05-16 15:48:50 +02:00
7e3558d5f9 Fix another infos typo 2019-05-16 15:07:58 +02:00
fa585716ae Sidebar correctly collapse 2019-05-11 17:08:29 +02:00
c04ee45098 Add search bar to side bar 2019-05-11 17:03:09 +02:00
356d70651b Begin to draw side bar (add user logo) 2019-05-11 16:43:55 +02:00
b436c1aabd Updated navbar 2019-05-11 16:19:13 +02:00
409349f114 Fix typo (thanks Alexis F.) 2019-04-17 18:25:07 +02:00
609c8dd637 Android app compatibility issue : force camera to be active to initialize connection. 2019-02-26 18:48:24 +01:00
69fffc2f32 Improved the way ready messages are sent 2019-02-26 18:35:19 +01:00
be22b55f89 Establish connection to remote before getting user media 2019-02-25 12:56:03 +01:00
6e1e05845b Fix issue on page reloading 2019-02-25 11:55:22 +01:00
650c761c51 Fixed dark theme issues 2019-02-25 07:57:45 +01:00
2e07945994 Block YouTube video by default 2019-02-23 19:08:34 +01:00
d9fe86d160 Added first TypeScript typing rules 2019-02-23 19:08:25 +01:00
bbaaf3a5c2 Only allow one window per conversation 2019-02-23 18:36:40 +01:00
0f4d3042c3 Enabled trickling with WebRTC 2019-02-23 18:30:05 +01:00
be0306b309 Close ring screen if user respond to call on another client 2019-02-23 18:27:31 +01:00
c819aaf716 Fix -1 year ago issue 2019-02-02 10:34:50 +01:00
b6e818dc00 Improved call window size 2019-02-02 10:32:37 +01:00
a3f8e2f243 Get number of members per conversation from API 2019-02-02 08:25:12 +01:00
9f3311978d Block calls for browsers that does not support it. 2019-02-02 08:13:06 +01:00
817ef1069c Can specify whether the signaling server is secure or not. 2019-02-02 08:11:11 +01:00
faba9b36cb Fix build system. 2019-01-26 16:46:36 +01:00
5276790afe Fix ring screen issue 2019-01-26 16:07:57 +01:00
8d613d4e57 Avoid stop loops 2019-01-26 16:03:15 +01:00
5a067001e9 Automatically close ring screen if other peer gives up with connection 2019-01-26 15:59:06 +01:00
1a3117a603 Created calls utilities 2019-01-26 15:49:08 +01:00
cbfe141c32 Play song when the phone is ringing 2019-01-26 15:43:26 +01:00
35c4597017 Can play forever songs 2019-01-26 15:33:43 +01:00
289a66e55b Created song player class 2019-01-26 15:26:49 +01:00
8c6e04abd0 Change cursor on call window title 2019-01-26 12:11:52 +01:00
79dfa0511b Made call system responsive 2019-01-26 12:10:41 +01:00
982c40788c Close more properly local streams. 2019-01-26 11:53:43 +01:00
a46a7154ea Improve dark theme 2019-01-26 11:42:46 +01:00
fe2a6c2dfe Can hide local stream 2019-01-26 11:40:39 +01:00
c1053b8041 Improve window position 2019-01-26 11:11:25 +01:00
194b6c60de Can switch to full screen 2019-01-26 10:57:58 +01:00
0b806d5bb2 Made call window draggable 2019-01-26 10:23:57 +01:00
b8865b96f0 Added footer buttons 2019-01-26 09:52:40 +01:00
b62fefc258 Fix issue 2019-01-26 08:15:17 +01:00
590e1d6794 Automatically close call when a user is the last on a call. 2019-01-26 08:14:17 +01:00
ece7a97d42 Follow API update 2019-01-25 19:18:12 +01:00
99fffb839f Each conversation use its own stream to media and audio stream 2019-01-25 19:03:23 +01:00
154f1b98ef Improved video appearance 2019-01-25 19:03:00 +01:00
45a4f552e8 Got a visual ! 2019-01-25 18:49:50 +01:00
ca39a08d07 Remote stream available ! 2019-01-25 18:30:01 +01:00
5eb1c8b274 Added SimplePeer attribution in README 2019-01-25 17:49:36 +01:00
29b5499b85 Created call window body 2019-01-25 15:34:40 +01:00
b08255cd18 Can detect if a call was rejected 2019-01-25 15:24:32 +01:00
be03249f11 Removed useless source code 2019-01-25 10:13:30 +01:00
0a52bd5fe3 Can reopen calls on page reload 2019-01-25 10:08:55 +01:00
9eab6c7e2e Can respond to calls 2019-01-25 09:43:19 +01:00
118cfeee41 Created ring screen 2019-01-25 09:15:34 +01:00
f79ef55e3b Created a function to easily get the name of a conversation 2019-01-24 18:14:53 +01:00
5640580397 Get user media 2019-01-24 14:50:03 +01:00
e90c20c262 Display basic call window 2019-01-24 14:40:36 +01:00
cd4e6ddcb1 Show call button on conversation of two people when available 2019-01-23 15:45:19 +01:00
feb17e3f13 Automatically retrieve calls configuration 2019-01-23 15:19:34 +01:00
e6f4159e53 Fixed dark theme issues 2019-01-21 09:06:27 +01:00
2d88a71b80 Fix issue 2019-01-21 08:30:56 +01:00
6c090b4967 Bumped to 2019 2019-01-21 07:51:16 +01:00
f67670dc0a Fixed little issue 2019-01-20 19:40:29 +01:00
a03fc1a745 Integrated personnal data navigator 2019-01-20 18:04:09 +01:00
32c484b41a Added personnal data navigator build file 2019-01-20 17:17:13 +01:00
c89edd3cd6 Display conversation messages. 2019-01-15 08:25:59 +01:00
4d775494c0 Added all conversation messages 2019-01-15 07:32:07 +01:00
f9c1f37ac6 Display user movies. 2019-01-15 07:17:06 +01:00
0e3aee13bd Display survey responses 2019-01-14 21:19:06 +01:00
4a24d5249c Display user likes 2019-01-14 21:12:06 +01:00
64ead89601 Improved appearance of processed categories 2019-01-14 21:04:10 +01:00
b48b6db028 Display all comments 2019-01-14 21:01:44 +01:00
59e6eb3c30 Improved project structure 2019-01-14 20:51:24 +01:00
8072d1eb3e Display surveys 2019-01-14 20:48:03 +01:00
e1dea40167 Display posts with countdown timer. 2019-01-14 19:26:18 +01:00
f3efb3d390 Show posts with PDFs 2019-01-14 19:22:15 +01:00
2035b85a06 Added post weblink 2019-01-14 19:11:03 +01:00
100032fa86 Can show movies 2019-01-14 18:48:43 +01:00
3da2455945 Display YouTube post 2019-01-14 18:40:28 +01:00
30a96d56ec Begin to display posts 2019-01-14 15:30:42 +01:00
a7a36d8665 Display friends information 2019-01-14 14:36:20 +01:00
a0ef614252 Improved navigation 2019-01-14 14:19:56 +01:00
229b02534e Display user information 2019-01-14 14:13:18 +01:00
f2ab71cf3f Work progress on project UI 2019-01-14 13:17:05 +01:00
497b8f1274 Added export categories 2019-01-14 09:56:46 +01:00
98765057dd Added account export assets 2019-01-14 09:39:09 +01:00
824de4bcdb Added gitignore 2019-01-14 08:27:29 +01:00
72fe0843c4 Fix dark theme issue 2019-01-11 18:27:02 +01:00
584bb42c93 Can update conversation message content. 2019-01-11 18:17:37 +01:00
f8e8454b86 Can delete conversation messages 2019-01-11 17:57:55 +01:00
41354be949 Added easter egg (a pacman game) 2019-01-11 16:34:43 +01:00
457712cd35 Fix HTTPS issue 2019-01-11 15:23:18 +01:00
a0d644469d Added incognito mode 2019-01-11 14:50:06 +01:00
f76d9ba9cd Display bottom links on main menu. 2019-01-11 11:54:22 +01:00
dc7fd44b67 Splited main menu links list and rendering. 2019-01-11 11:38:55 +01:00
fba7937d02 Splited bottom links list and rendering 2019-01-11 11:11:25 +01:00
f418ee25b0 Fix dark theme issue on friends list on mobiles 2019-01-10 17:10:49 +01:00
c05506a2a5 Dark theme persistant on page reload. 2019-01-10 17:07:42 +01:00
5bb4e2ae1f Improved dark theme 2019-01-10 17:01:00 +01:00
fc70840c41 Sceditor auto-expanding on post create form. 2019-01-10 16:47:20 +01:00
dff9831228 Improved Sceditor integration 2019-01-10 16:28:59 +01:00
6d61c0d621 Improve dark theme 2019-01-10 15:53:16 +01:00
b16ca0defd Basic integration of dark theme. 2019-01-10 15:44:39 +01:00
93df9d235d Fixed build issues. 2019-01-10 14:59:12 +01:00
Pierre HUBERT
069922b7da Merge remote-tracking branch 'origin/dark-theme-design' 2019-01-10 14:28:40 +01:00
a7337fa918 Work progress on dark theme 2019-01-09 11:40:00 +01:00
da047a976a Improved dark theme 2019-01-09 09:49:02 +01:00
379826f16b Work progress on dark theme 2019-01-08 20:55:40 +01:00
5dc64492cb Reorganized dark theme file 2019-01-08 20:28:41 +01:00
5ac5101ced Start to work on dark theme 2019-01-08 20:07:38 +01:00
Pierre HUBERT
fdabb3e3fc Improved input appearance. 2018-12-27 19:07:39 +01:00
Pierre HUBERT
2890b03283 Switched to BBCode language for posts. 2018-12-27 14:02:01 +01:00
Pierre HUBERT
f6e2c83dbd Added the possibility to create a detached picker. 2018-12-27 11:18:52 +01:00
Pierre HUBERT
c2eba7b3be Fix security breach. 2018-12-08 19:03:53 +01:00
Pierre HUBERT
089739e141 Added (w) smiley 2018-12-01 10:46:33 +01:00
Pierre HUBERT
5c19d9c04c Play a song when new notifications arrives. 2018-11-24 18:54:02 +01:00
Pierre HUBERT
46bb22b17b Display the number of notifications on page title. 2018-11-24 16:01:45 +01:00
Pierre HUBERT
d49b04e6fb Do not display JS errors in production mode. 2018-11-24 11:24:31 +01:00
Pierre HUBERT
672cbc1409 Form keep focus after sending a message onconversation page. 2018-09-07 10:00:05 +02:00
Pierre HUBERT
34f652d3bf Fix issue when responding to a group invitation. 2018-09-02 17:39:00 +02:00
Pierre HUBERT
8f65890f29 Added the form to invite a user. 2018-09-02 17:34:30 +02:00
Pierre HUBERT
413cc6ddf8 Reorganized groups member page. 2018-09-02 15:05:52 +02:00
Pierre HUBERT
ccd0fd03a9 Improve groups appearance 2018-09-02 14:26:20 +02:00
Pierre HUBERT
6588b3d13a Add a notice when the user does not belong to any group. 2018-09-02 14:20:32 +02:00
Pierre HUBERT
4860ee6623 Upgraded request. 2018-09-02 14:14:21 +02:00
Pierre HUBERT
e8df43351f Can force the request to get multiple groups. 2018-09-02 14:14:10 +02:00
Pierre HUBERT
1c1dbe8454 Can delete groups. 2018-08-31 10:33:51 +02:00
Pierre HUBERT
7e09e0f2f9 Created a method to prompt user password. 2018-08-31 10:25:02 +02:00
Pierre HUBERT
c495337aa6 Click on search link collapse toggle menu 2018-08-31 09:06:29 +02:00
Pierre HUBERT
f91ffba2a4 Display the number of responses for a choice on survey choices. 2018-08-26 15:10:03 +02:00
Pierre HUBERT
affe9a96f5 Fix typo 2018-08-26 14:01:06 +02:00
Pierre HUBERT
44fa0bea24 Handles too many account creation request error. 2018-08-20 14:51:02 +02:00
Pierre HUBERT
e77b509202 Handle already existing email account error. 2018-08-20 14:16:46 +02:00
Pierre HUBERT
06b43732a9 Handle "too many request" login errors. 2018-08-20 13:55:05 +02:00
Pierre HUBERT
ee2689ad84 Reduce too long conversation names. 2018-08-16 12:37:03 +02:00
Pierre HUBERT
8eadb03d59 Updated language picker. 2018-08-15 08:55:15 +02:00
Pierre HUBERT
6e0b3a4345 Added language settings 2018-08-15 08:51:02 +02:00
Pierre HUBERT
c633ce13b5 Save language in user account settings. 2018-08-15 08:26:14 +02:00
Pierre HUBERT
40593e00ed Automatically detect appropriated language 2018-08-15 07:52:05 +02:00
Pierre HUBERT
e214573e4e Add missing translation. 2018-08-15 07:45:58 +02:00
Pierre HUBERT
0825aba022 Fix typo 2018-08-15 07:44:34 +02:00
Pierre HUBERT
7a65263873 Added french translation 2018-08-09 12:30:22 +02:00
Pierre HUBERT
97f476e416 Fix bad translation 2018-08-09 11:51:38 +02:00
Pierre HUBERT
3dce138811 Fix error 2018-08-07 11:02:25 +02:00
Pierre HUBERT
28edb3122f Completed posts component translation. 2018-08-05 16:43:23 +02:00
Pierre HUBERT
2cd9338417 Added translation for dates 2018-08-05 16:40:14 +02:00
Pierre HUBERT
0af31052b4 Translated messages script. 2018-08-05 16:33:39 +02:00
Pierre HUBERT
81ba811622 Added comments component translation. 2018-08-05 16:29:49 +02:00
Pierre HUBERT
4b7008b5ba Fix typo. 2018-08-05 16:21:59 +02:00
Pierre HUBERT
02744d5c72 Translated post UI. 2018-08-05 16:13:48 +02:00
Pierre HUBERT
52c963cf1b Translated notifications dropdown. 2018-08-04 10:02:12 +02:00
Pierre HUBERT
52d1328f93 Translated conversations dropdown. 2018-08-04 09:58:40 +02:00
Pierre HUBERT
50b40ac5b0 Completed authenticated bar translation. 2018-08-04 09:53:35 +02:00
Pierre HUBERT
e1c3b0c002 Added an attribute to createElem2 to ease translation. 2018-08-04 09:51:01 +02:00
Pierre HUBERT
f859abcb2f Translated friends bar. 2018-08-04 09:37:36 +02:00
Pierre HUBERT
6e08208fed Translated like button. 2018-08-04 09:35:28 +02:00
Pierre HUBERT
391c74df62 Translated friendship status section. 2018-08-04 09:32:40 +02:00
Pierre HUBERT
5f2deebfb5 Translated access forbidden page. 2018-08-04 09:28:28 +02:00
Pierre HUBERT
6fa2123d57 Translated user page posts section. 2018-08-04 09:24:46 +02:00
Pierre HUBERT
536570abf1 Translated profile infos about user section. 2018-08-04 09:21:49 +02:00
Pierre HUBERT
ad67f6d852 Added translation to post form 2018-08-04 09:15:02 +02:00
Pierre HUBERT
ac6539a82c Added missing translation in post form. 2018-08-04 09:09:02 +02:00
Pierre HUBERT
1e1021fd49 Added translation for lastest posts page. 2018-08-04 09:03:31 +02:00
Pierre HUBERT
499aefbc1d Improved site responsive 2018-08-03 15:27:56 +02:00
Pierre HUBERT
c973b33ac8 Completed login page translation. 2018-08-03 15:14:53 +02:00
Pierre HUBERT
3397ddbf44 Completed home page translation. 2018-08-03 15:13:22 +02:00
Pierre HUBERT
607d2fafca Translated account created page. 2018-08-03 15:11:42 +02:00
Pierre HUBERT
ec7abaaf14 Translated create account page. 2018-08-03 15:07:59 +02:00
Pierre HUBERT
a389d731c2 Started to 2018-08-03 14:51:22 +02:00
Pierre HUBERT
4d7a99aeea Change page title 2018-08-02 09:43:24 +02:00
Pierre HUBERT
04b80782dc Support group membership notifications 2018-08-02 09:23:38 +02:00
Pierre HUBERT
837bc35a6b Improved search form responsive mode. 2018-08-01 06:44:01 +02:00
Pierre HUBERT
c98683e573 Improved groups page responsiveness. 2018-08-01 06:33:02 +02:00
Pierre HUBERT
f6eea9ebf8 Use iCheck flat checkboxes only. 2018-08-01 06:22:24 +02:00
Pierre HUBERT
7e99e8b14b Fix issue. 2018-07-31 13:55:58 +02:00
Pierre HUBERT
95b4c5fbc7 Created search page. 2018-07-31 13:53:57 +02:00
Pierre HUBERT
a50cca62d3 Fix bad comment. 2018-07-29 17:17:54 +02:00
Pierre HUBERT
f122da1306 Close search form dropdown on click on "see more results" 2018-07-29 17:12:52 +02:00
Pierre HUBERT
0692a689f1 Upgraded search component to include groups suppport. 2018-07-29 17:11:38 +02:00
Pierre HUBERT
fc8abc6d56 Upgraded search form component structure. 2018-07-29 08:08:23 +02:00
Pierre HUBERT
547daf4741 Ask to include groups posts in latest posts thread. 2018-07-20 15:17:26 +02:00
Pierre HUBERT
476f1b24a7 Improved posts UI 2018-07-20 14:27:49 +02:00
Pierre HUBERT
693b1fa26c Improved the way the name of the users who created the posts are shown. 2018-07-20 14:22:27 +02:00
Pierre HUBERT
655432a500 Fixed typo 2018-07-20 13:55:58 +02:00
Pierre HUBERT
bd888f0f47 Can display notifications related to groups posts. 2018-07-20 13:51:13 +02:00
Pierre HUBERT
ede515f7a2 Fix responsive issue 2018-07-20 09:23:32 +02:00
Pierre HUBERT
fa24c2d090 Fixed space 2018-07-20 09:17:06 +02:00
Pierre HUBERT
1522248793 Updated year notice 2018-07-20 09:16:50 +02:00
Pierre HUBERT
cc1e4dd22a Can get information about multiple groups and cache them. 2018-07-20 09:07:00 +02:00
Pierre HUBERT
61a20e8708 Added follow block. 2018-07-19 14:34:19 +02:00
Pierre HUBERT
a5815272c8 Fix bug 2018-07-17 10:27:32 +02:00
Pierre HUBERT
f66aba031c Display likes block. 2018-07-17 10:23:35 +02:00
Pierre HUBERT
059fcc72b6 Handles new kind of visibility level : members 2018-07-17 09:58:04 +02:00
Pierre HUBERT
acb4e1b384 Can scroll posts list to get older posts. 2018-07-17 09:40:13 +02:00
Pierre HUBERT
74e06a2b89 Display the posts of a group 2018-07-17 09:23:44 +02:00
Pierre HUBERT
2032017b0c Created new shorcut to open groups quickly 2018-07-16 15:13:17 +02:00
Pierre HUBERT
500633862e It is not possible to create private posts for groups. 2018-07-16 13:48:35 +02:00
Pierre HUBERT
57306d6872 Fix error 2018-07-16 13:30:20 +02:00
Pierre HUBERT
31bbc2326c Goups pages dynamically updated the title of the page. 2018-07-16 09:32:03 +02:00
Pierre HUBERT
5c0cdced85 Display posts creation form on groups pages. 2018-07-16 09:13:51 +02:00
Pierre HUBERT
07af7c961d Fix typo 2018-07-16 09:00:35 +02:00
Pierre HUBERT
ddd54e05e5 Can request update of posts creation level of the group. 2018-07-16 08:48:47 +02:00
Pierre HUBERT
1fb1e62fb6 Display url and description information in group header 2018-07-16 08:27:31 +02:00
Pierre HUBERT
80630dae58 Settings now includes group description and URL 2018-07-15 19:05:10 +02:00
Pierre HUBERT
85c117ff81 Updated licence 2018-07-15 18:37:56 +02:00
Pierre HUBERT
a62d2a495e Display group tag 2018-07-15 18:37:10 +02:00
Pierre HUBERT
51c248e463 Upgraded openUserPage function 2018-07-14 14:18:21 +02:00
Pierre HUBERT
665cbb8374 Virtual directory are handled at website's root directories. 2018-07-14 14:07:27 +02:00
Pierre HUBERT
5cfee77bb2 Added a live notice to check the availability of a virtual directory for a group. 2018-07-14 11:48:59 +02:00
Pierre HUBERT
a8e686d59b Can update the virtual directory of a group 2018-07-14 11:09:14 +02:00
Pierre HUBERT
6111e527e0 Added Travis configuration. 2018-07-12 13:50:33 +02:00
Pierre HUBERT
1b9ccfc95b Can request a membership deletion on the API 2018-07-10 14:48:16 +02:00
Pierre HUBERT
59c917f599 Display the list of groups of a user 2018-07-10 14:35:44 +02:00
Pierre HUBERT
b67f3b055f Can request membership level update. 2018-07-10 08:15:44 +02:00
Pierre HUBERT
1d88b8ea69 Can cancel groups membership invitations. 2018-07-09 15:57:51 +02:00
Pierre HUBERT
d541506820 Can respond to membership requests 2018-07-09 15:41:48 +02:00
Pierre HUBERT
c9d0a597f5 Can request membership deletion on the server. 2018-07-07 15:56:13 +02:00
Pierre HUBERT
e805dda4fb Created groups members table. 2018-07-07 15:27:27 +02:00
Pierre HUBERT
0be49b0d35 Made group registration level and visibility public 2018-07-07 07:36:03 +02:00
Pierre HUBERT
0c20b97b2f Improved header appearance 2018-07-07 07:27:55 +02:00
Pierre HUBERT
d32c1428cf Send group membreship requests to the server. 2018-07-06 18:48:49 +02:00
Pierre HUBERT
f90dc5d9ae Fix mistake 2018-07-06 18:43:14 +02:00
Pierre HUBERT
89df9f0315 Send a request to the server to cancel membership request. 2018-07-06 07:09:24 +02:00
Pierre HUBERT
561a3e9342 Can respond to group invitations. 2018-07-05 13:37:56 +02:00
Pierre HUBERT
66392491b5 Fix issue on signed out site. 2018-07-05 13:17:33 +02:00
Pierre HUBERT
a100d4a403 Display when the user is a moderator, a administrator or a member of a group. 2018-07-05 08:38:52 +02:00
Pierre HUBERT
9866298f19 Improved settings appearance 2018-07-05 08:10:42 +02:00
Pierre HUBERT
3bda514879 Can update group registration level. 2018-07-05 08:03:45 +02:00
Pierre HUBERT
7db41a9183 Display basic information about a group when access to it is forbidden. 2018-07-05 07:43:03 +02:00
Pierre HUBERT
dfce597139 Can update group visibility 2018-07-04 16:20:00 +02:00
Pierre HUBERT
24357aeb05 Fixed verb 2018-07-04 14:21:58 +02:00
Pierre HUBERT
a438eb81f0 Can generate a random group logo 2018-07-04 14:19:43 +02:00
Pierre HUBERT
1d92a5bf1c Can send a request on the API to delete group logo. 2018-07-04 14:07:16 +02:00
Pierre HUBERT
eb69734a38 Send a new group logo to the server. 2018-07-04 13:27:07 +02:00
Pierre HUBERT
6239d43f05 Added backward link 2018-07-04 11:39:33 +02:00
Pierre HUBERT
4c3985fc24 Send request to update group settings. 2018-07-04 11:26:18 +02:00
Pierre HUBERT
218e9b6fbe Retrieve group settings on the API 2018-07-04 06:05:14 +02:00
Pierre HUBERT
30696174f2 Added basic group information 2018-07-03 13:06:55 +02:00
Pierre HUBERT
a3ddd525d0 Updated comments creation request 2018-07-03 12:32:44 +02:00
Pierre HUBERT
2b8a7f08cb Fixed issue 2018-07-03 12:12:40 +02:00
Pierre HUBERT
e28b99f40c Basic groups header 2018-07-03 11:45:57 +02:00
Pierre HUBERT
b527b3a22d Fix error 2018-07-03 11:39:53 +02:00
Pierre HUBERT
0b5e50aade Fix build issue 2018-07-03 11:38:43 +02:00
Pierre HUBERT
dd53a39c4b Javascript errors are reported 2018-07-03 08:32:55 +02:00
Pierre HUBERT
f4e1b47d9d Improved groups creation form 2018-07-02 08:57:41 +02:00
Pierre HUBERT
28cb1e22e7 Send a request to the server to create the group 2018-07-02 08:42:55 +02:00
Pierre HUBERT
7ff7bceca3 Created groups main page 2018-07-02 08:07:59 +02:00
Pierre HUBERT
074b724d68 Made URLs detection more efficient 2018-07-02 07:39:04 +02:00
Pierre
1ae92eeac8 Updated parser. 2018-05-27 12:10:42 +02:00
Pierre
30fd40ad72 Do not show password reset form in case of error. 2018-05-27 11:12:16 +02:00
Pierre
972232b370 Optimized code 2018-05-26 16:21:18 +02:00
Pierre
2e0b130ac5 Optimize latest posts page 2018-05-26 16:19:24 +02:00
Pierre
2c07e76684 Reduce traffic 2018-05-26 16:16:32 +02:00
Pierre
9325cdd68b Made password reset available 2018-05-26 16:07:01 +02:00
Pierre
19797b8731 Offer the user to reset his password 2018-05-26 15:50:33 +02:00
Pierre
4ea1761c72 Fix too long URLs on error page 2018-05-26 07:32:32 +02:00
Pierre
e0d5e50357 Security questions form now lives 2018-05-26 07:30:02 +02:00
Pierre
f5638c3196 Can precise a time end to countdown timers 2018-05-24 21:22:50 +02:00
Pierre
fa1c1596d5 Get the list of security questions of the user 2018-05-23 21:41:02 +02:00
Pierre
bde2b5dde6 Made the option "contact admin" lives 2018-05-23 21:14:54 +02:00
Pierre
91f8edd2de Create <p> tags quickly 2018-05-23 21:14:38 +02:00
Pierre
9a7c3245c4 Prompt user preferred option to reset its password 2018-05-22 22:48:48 +02:00
Pierre
79da14e0bc Added link to privacy policy on settings page 2018-05-22 22:23:16 +02:00
Pierre
683a8eb0e6 Prompt user email on password reset 2018-05-21 10:40:44 +02:00
Pierre
b0c4971838 Create empty password forgotten page 2018-05-21 10:05:32 +02:00
Pierre
d01b9f4803 Page reload only in case of error 412 2018-05-20 15:01:25 +02:00
Pierre
f4d019046d Updated welcome message 2018-05-20 14:48:16 +02:00
Pierre
f41ac3b107 Added conversation page to top menu 2018-05-20 14:39:55 +02:00
Pierre
8777832600 Dynamically resize conversation page boxes 2018-05-20 14:31:46 +02:00
Pierre
8458c6190d Fix links appearance issue 2018-05-19 11:19:39 +02:00
Pierre
725871dab1 Fix online config issue 2018-05-19 10:44:19 +02:00
Pierre
d687e9962e Added Comunic.io build configuration 2018-05-19 10:25:42 +02:00
Pierre
7abe97c1c2 Updated beta configuration 2018-05-19 10:22:24 +02:00
Pierre
cfa5be5612 Can force connection to the website in https 2018-05-19 10:22:09 +02:00
Pierre
b679b7e651 Display only unread conversations in bold 2018-05-16 17:56:59 +02:00
Pierre
2fc2b0d641 Fix long words issue 2018-05-16 17:56:48 +02:00
Pierre
c2b8177792 Improved conversation selection 2018-05-16 17:52:42 +02:00
Pierre
b9cc47f05d Split refresh list method and create box method 2018-05-16 07:00:06 +02:00
Pierre
ec13b6902b Current conversation is highlited 2018-05-16 06:47:41 +02:00
Pierre
19576cebed Conversations page need login 2018-05-16 06:40:26 +02:00
Pierre
ebd2fcf4f5 Conversations page admit conversation number as subfolder 2018-05-15 21:34:02 +02:00
Pierre
73dfc842af Site current URI can now be easily updated. 2018-05-15 21:32:02 +02:00
Pierre
1f636b7a5f Fix security issue 2018-05-15 21:15:09 +02:00
Pierre
4a20815619 Can load older messages on conversations page 2018-05-15 19:17:23 +02:00
Pierre
bf00a52430 Work progress on conversation page 2018-05-14 20:29:44 +02:00
Pierre
bca2e6449e Apply user information on messages 2018-05-14 20:04:03 +02:00
Pierre
46912f47c7 Basic display of conversation messages 2018-05-14 19:17:28 +02:00
Pierre
7a473d1aa8 Can query the server to refresh only a single conversation. 2018-05-14 17:23:33 +02:00
Pierre
92c7c80fbc Fix space issue 2018-05-14 17:04:21 +02:00
Pierre
701d070efd Fix iOS 9 issue 2018-05-14 16:58:23 +02:00
Pierre
4ec6213877 User data are included in data archive 2018-05-14 16:53:11 +02:00
Pierre
e06a658422 Installed JSZip Utils 2018-05-14 16:25:49 +02:00
Pierre
d086f9dfab Generate a ZIP file with orig JSON file 2018-05-13 21:27:46 +02:00
Pierre
8f668c1bfa Added FileSaver 2018-05-13 21:08:34 +02:00
Pierre
88308778d7 Can determine the list of files to download 2018-05-13 20:59:33 +02:00
Pierre
7db7ecf69a Added JSZip 2018-05-13 20:29:07 +02:00
Pierre
f447f30c6c Send request to get all account data 2018-05-13 16:52:19 +02:00
Pierre
e9b6df8536 Pause conversation feature development 2018-05-13 15:51:49 +02:00
Pierre
e32a7c67e1 Can send messages from the conversation page 2018-05-13 15:40:19 +02:00
Pierre
e376c789a6 Display the list of conversations 2018-05-13 14:36:40 +02:00
Pierre
1d9ae0dadd Created conversations page 2018-05-13 14:06:32 +02:00
Pierre
1a922704ed URLs can be parsed 2018-05-13 12:16:32 +02:00
Pierre
7a3387b550 Fix issue with tagging and emails 2018-05-13 11:59:54 +02:00
Pierre
5e29916f97 Added OpenGraph information to the main page 2018-05-12 15:48:40 +02:00
Pierre
d0ae8d0620 Fix iCheck issue on built version 2018-05-12 15:44:46 +02:00
Pierre
4ef2e7f219 Added new link to about website in the footer 2018-05-12 12:40:46 +02:00
Pierre
b412214976 Made easier to leave the website 2018-05-12 12:34:39 +02:00
Pierre
1e299b6d5e Updated home page 2018-05-12 12:26:04 +02:00
Pierre
5c5110a7cf User can generate random image 2018-05-12 10:06:56 +02:00
Pierre
84df7adc89 Can generate random itentiy image 2018-05-12 09:51:25 +02:00
Pierre
7ccfec5845 Made latest posts accessible for URI / 2018-05-11 08:03:32 +02:00
Pierre
b69811105f Enlarge list of latest posts 2018-05-11 08:02:04 +02:00
Pierre
925e0b11e8 Set a maximal length to comment input 2018-05-11 07:51:32 +02:00
Pierre
9126a08d2f Added a link on home page to about website 2018-05-10 15:17:49 +02:00
Pierre
4383efa32c Users must accept terms of use of the network 2018-05-10 15:06:29 +02:00
Pierre
688a9de2b1 Added About Website URL (offline) 2018-05-10 15:00:10 +02:00
Pierre
2c260c7174 Fix typo 2018-05-10 10:54:32 +02:00
Pierre
42c934b723 Translated home page 2018-05-10 10:54:00 +02:00
Pierre
cb2a7a5b04 Made translation of templates easier 2018-05-10 10:48:59 +02:00
Pierre
28097368e1 Completed login page translation 2018-05-10 10:39:10 +02:00
Pierre
877d9b40f5 Updated Docker build configuration 2018-05-09 18:37:44 +02:00
Pierre
aefc20198c Created online configuration 2018-05-09 18:36:53 +02:00
Pierre
4ac1b15520 Fix fonts issue 2018-05-09 18:29:42 +02:00
Pierre
b457786ae9 Fix Chrome issue 2018-05-09 16:13:37 +02:00
Pierre
d6413887c2 Can send request to delete user accounts 2018-05-09 14:57:46 +02:00
Pierre
e55614b4c8 Fix close issue 2018-05-09 14:07:58 +02:00
Pierre
53edcd8ffc Created privacy settings section 2018-05-09 12:18:28 +02:00
Pierre
99f86060a4 Fix iOS 9 issue 2018-05-09 12:05:11 +02:00
Pierre
0c68b8dd5d Fix iCheck issue with builder 2018-05-08 18:10:53 +02:00
Pierre
11d5bdf752 Fix ionicons with builder 2018-05-08 18:06:35 +02:00
Pierre
27401c9070 Create Docker build configuration 2018-05-08 12:45:46 +02:00
Pierre
beafe2580a Fix issue 2018-05-08 12:39:16 +02:00
484 changed files with 96683 additions and 2078 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@
# Build directory
output/*
output.tar

13
.travis.yml Normal file
View File

@ -0,0 +1,13 @@
sudo: required
language: php
services:
- docker
#Target PHP versions
php:
- 7.2
script:
- docker run -t -v $(pwd):/data pierre42100/docker-comunicwebappscratch /data/builder build offline

View File

@ -1,5 +1,5 @@
MIT License
Copyright (c) <year> <copyright holders>
Copyright (c) 2017-2019 Pierre HUBERT
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

View File

@ -20,4 +20,15 @@ ComunicWeb would not exists without the following technologies developped by the
- VideoJS
- jquery.hotkeys
- bootstrap-wysiwyg (https://github.com/steveathon/bootstrap-wysiwyg/)
- wdt-emoji-bundle (http://ned.im/wdt-emoji-bundle)
- wdt-emoji-bundle (http://ned.im/wdt-emoji-bundle)
- PNGLib (http://www.xarg.org/2010/03/generate-client-side-png-files-using-javascript/) (BSD License)
- Identicon (http://github.com/stewartlord/identicon.js) (BSD License)
- FileSaver.js (http://eligrey.com) (by Eli Grey) (MIT License)
- JSZip (https://github.com/Stuk/jszip.git) (MIT License)
- JSZip Utils (https://github.com/Stuk/jszip-utils.git) (MIT License)
- SCEditor (BBC WYIWYG editor) (https://github.com/samclarke/SCEditor) (MIT License)
- JavaScript BBCode Parser (https://github.com/Frug/js-bbcode-parser) (MIT License)
- Pacman (https://github.com/daleharvey/pacman) (WTFPL License)
- SimplePeer (https://github.com/feross/simple-peer) (MIT License)
- TensorFlow JS
- TensorFlow Models

247
assets/3rdparty/FileSaver.js vendored Normal file
View File

@ -0,0 +1,247 @@
/*! FileSaver.js
* A saveAs() FileSaver implementation.
* 2014-01-24
*
* By Eli Grey, http://eligrey.com
* License: X11/MIT
* See LICENSE.md
*/
/*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
var saveAs = saveAs
// IE 10+ (native saveAs)
|| (typeof navigator !== "undefined" &&
navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
// Everyone else
|| (function(view) {
"use strict";
// IE <10 is explicitly unsupported
if (typeof navigator !== "undefined" &&
/MSIE [1-9]\./.test(navigator.userAgent)) {
return;
}
var
doc = view.document
// only get URL when necessary in case BlobBuilder.js hasn't overridden it yet
, get_URL = function() {
return view.URL || view.webkitURL || view;
}
, URL = view.URL || view.webkitURL || view
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
, can_use_save_link = !view.externalHost && "download" in save_link
, click = function(node) {
var event = doc.createEvent("MouseEvents");
event.initMouseEvent(
"click", true, false, view, 0, 0, 0, 0, 0
, false, false, false, false, 0, null
);
node.dispatchEvent(event);
}
, webkit_req_fs = view.webkitRequestFileSystem
, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
, throw_outside = function(ex) {
(view.setImmediate || view.setTimeout)(function() {
throw ex;
}, 0);
}
, force_saveable_type = "application/octet-stream"
, fs_min_size = 0
, deletion_queue = []
, process_deletion_queue = function() {
var i = deletion_queue.length;
while (i--) {
var file = deletion_queue[i];
if (typeof file === "string") { // file is an object URL
URL.revokeObjectURL(file);
} else { // file is a File
file.remove();
}
}
deletion_queue.length = 0; // clear queue
}
, dispatch = function(filesaver, event_types, event) {
event_types = [].concat(event_types);
var i = event_types.length;
while (i--) {
var listener = filesaver["on" + event_types[i]];
if (typeof listener === "function") {
try {
listener.call(filesaver, event || filesaver);
} catch (ex) {
throw_outside(ex);
}
}
}
}
, FileSaver = function(blob, name) {
// First try a.download, then web filesystem, then object URLs
var
filesaver = this
, type = blob.type
, blob_changed = false
, object_url
, target_view
, get_object_url = function() {
var object_url = get_URL().createObjectURL(blob);
deletion_queue.push(object_url);
return object_url;
}
, dispatch_all = function() {
dispatch(filesaver, "writestart progress write writeend".split(" "));
}
// on any filesys errors revert to saving with object URLs
, fs_error = function() {
// don't create more object URLs than needed
if (blob_changed || !object_url) {
object_url = get_object_url(blob);
}
if (target_view) {
target_view.location.href = object_url;
} else {
window.open(object_url, "_blank");
}
filesaver.readyState = filesaver.DONE;
dispatch_all();
}
, abortable = function(func) {
return function() {
if (filesaver.readyState !== filesaver.DONE) {
return func.apply(this, arguments);
}
};
}
, create_if_not_found = {create: true, exclusive: false}
, slice
;
filesaver.readyState = filesaver.INIT;
if (!name) {
name = "download";
}
if (can_use_save_link) {
object_url = get_object_url(blob);
// FF for Android has a nasty garbage collection mechanism
// that turns all objects that are not pure javascript into 'deadObject'
// this means `doc` and `save_link` are unusable and need to be recreated
// `view` is usable though:
doc = view.document;
save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");
save_link.href = object_url;
save_link.download = name;
var event = doc.createEvent("MouseEvents");
event.initMouseEvent(
"click", true, false, view, 0, 0, 0, 0, 0
, false, false, false, false, 0, null
);
save_link.dispatchEvent(event);
filesaver.readyState = filesaver.DONE;
dispatch_all();
return;
}
// Object and web filesystem URLs have a problem saving in Google Chrome when
// viewed in a tab, so I force save with application/octet-stream
// http://code.google.com/p/chromium/issues/detail?id=91158
if (view.chrome && type && type !== force_saveable_type) {
slice = blob.slice || blob.webkitSlice;
blob = slice.call(blob, 0, blob.size, force_saveable_type);
blob_changed = true;
}
// Since I can't be sure that the guessed media type will trigger a download
// in WebKit, I append .download to the filename.
// https://bugs.webkit.org/show_bug.cgi?id=65440
if (webkit_req_fs && name !== "download") {
name += ".download";
}
if (type === force_saveable_type || webkit_req_fs) {
target_view = view;
}
if (!req_fs) {
fs_error();
return;
}
fs_min_size += blob.size;
req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
var save = function() {
dir.getFile(name, create_if_not_found, abortable(function(file) {
file.createWriter(abortable(function(writer) {
writer.onwriteend = function(event) {
target_view.location.href = file.toURL();
deletion_queue.push(file);
filesaver.readyState = filesaver.DONE;
dispatch(filesaver, "writeend", event);
};
writer.onerror = function() {
var error = writer.error;
if (error.code !== error.ABORT_ERR) {
fs_error();
}
};
"writestart progress write abort".split(" ").forEach(function(event) {
writer["on" + event] = filesaver["on" + event];
});
writer.write(blob);
filesaver.abort = function() {
writer.abort();
filesaver.readyState = filesaver.DONE;
};
filesaver.readyState = filesaver.WRITING;
}), fs_error);
}), fs_error);
};
dir.getFile(name, {create: false}, abortable(function(file) {
// delete file if it already exists
file.remove();
save();
}), abortable(function(ex) {
if (ex.code === ex.NOT_FOUND_ERR) {
save();
} else {
fs_error();
}
}));
}), fs_error);
}), fs_error);
}
, FS_proto = FileSaver.prototype
, saveAs = function(blob, name) {
return new FileSaver(blob, name);
}
;
FS_proto.abort = function() {
var filesaver = this;
filesaver.readyState = filesaver.DONE;
dispatch(filesaver, "abort");
};
FS_proto.readyState = FS_proto.INIT = 0;
FS_proto.WRITING = 1;
FS_proto.DONE = 2;
FS_proto.error =
FS_proto.onwritestart =
FS_proto.onprogress =
FS_proto.onwrite =
FS_proto.onabort =
FS_proto.onerror =
FS_proto.onwriteend =
null;
view.addEventListener("unload", process_deletion_queue, false);
saveAs.unload = function() {
process_deletion_queue();
view.removeEventListener("unload", process_deletion_queue, false);
};
return saveAs;
}(
typeof self !== "undefined" && self
|| typeof window !== "undefined" && window
|| this.content
));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the window
if (typeof module !== "undefined") module.exports = saveAs;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,7 @@
width: 100px;
height: 100px;
cursor: crosshair;
background-image: url("img/saturation.png");
background-image: url("img-colorpicker/saturation.png");
}
.colorpicker-saturation i {
@ -64,12 +64,12 @@
}
.colorpicker-hue {
background-image: url("img/hue.png");
background-image: url("img-colorpicker/hue.png");
}
.colorpicker-alpha {
display: none;
background-image: url("img/alpha.png");
background-image: url("img-colorpicker/alpha.png");
}
.colorpicker-saturation,
@ -141,7 +141,7 @@
height: 10px;
margin-top: 5px;
clear: both;
background-image: url("img/alpha.png");
background-image: url("img-colorpicker/alpha.png");
background-position: 0 100%;
}
@ -221,11 +221,11 @@
}
.colorpicker.colorpicker-horizontal .colorpicker-hue {
background-image: url("img/hue-horizontal.png");
background-image: url("img-colorpicker/hue-horizontal.png");
}
.colorpicker.colorpicker-horizontal .colorpicker-alpha {
background-image: url("img/alpha-horizontal.png");
background-image: url("img-colorpicker/alpha-horizontal.png");
}
.colorpicker.colorpicker-hidden {

View File

@ -6,4 +6,4 @@
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
*/.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("img/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("img/hue.png")}.colorpicker-alpha{display:none;background-image:url("img/alpha.png")}.colorpicker-saturation,.colorpicker-hue,.colorpicker-alpha{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("img/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .input-group-addon i,.colorpicker-element .add-on i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("img/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("img/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto}
*/.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("img-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("img-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("img-colorpicker/alpha.png")}.colorpicker-saturation,.colorpicker-hue,.colorpicker-alpha{background-size:contain}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("img-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-selectors{display:none;height:10px;margin-top:5px;clear:both}.colorpicker-selectors i{float:left;width:10px;height:10px;cursor:pointer}.colorpicker-selectors i+i{margin-left:3px}.colorpicker-element .input-group-addon i,.colorpicker-element .add-on i{display:inline-block;width:16px;height:16px;vertical-align:text-top;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;z-index:auto;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("img-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("img-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block}.colorpicker-right:before{right:6px;left:auto}.colorpicker-right:after{right:7px;left:auto}

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(flat.png) no-repeat;
background: url(icheck-flat-imgs/flat.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat,
.iradio_flat {
background-image: url(flat@2x.png);
background-image: url(icheck-flat-imgs/flat@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -65,7 +65,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(red.png) no-repeat;
background: url(icheck-flat-imgs/red.png) no-repeat;
border: none;
cursor: pointer;
}
@ -105,7 +105,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-red,
.iradio_flat-red {
background-image: url(red@2x.png);
background-image: url(icheck-flat-imgs/red@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -121,7 +121,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(green.png) no-repeat;
background: url(icheck-flat-imgs/green.png) no-repeat;
border: none;
cursor: pointer;
}
@ -161,7 +161,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-green,
.iradio_flat-green {
background-image: url(green@2x.png);
background-image: url(icheck-flat-imgs/green@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -177,7 +177,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(blue.png) no-repeat;
background: url(icheck-flat-imgs/blue.png) no-repeat;
border: none;
cursor: pointer;
}
@ -217,7 +217,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-blue,
.iradio_flat-blue {
background-image: url(blue@2x.png);
background-image: url(icheck-flat-imgs/blue@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -233,7 +233,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(aero.png) no-repeat;
background: url(icheck-flat-imgs/aero.png) no-repeat;
border: none;
cursor: pointer;
}
@ -273,7 +273,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-aero,
.iradio_flat-aero {
background-image: url(aero@2x.png);
background-image: url(icheck-flat-imgs/aero@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -289,7 +289,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(grey.png) no-repeat;
background: url(icheck-flat-imgs/grey.png) no-repeat;
border: none;
cursor: pointer;
}
@ -329,7 +329,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-grey,
.iradio_flat-grey {
background-image: url(grey@2x.png);
background-image: url(icheck-flat-imgs/grey@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -345,7 +345,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(orange.png) no-repeat;
background: url(icheck-flat-imgs/orange.png) no-repeat;
border: none;
cursor: pointer;
}
@ -385,7 +385,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-orange,
.iradio_flat-orange {
background-image: url(orange@2x.png);
background-image: url(icheck-flat-imgs/orange@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -401,7 +401,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(yellow.png) no-repeat;
background: url(icheck-flat-imgs/yellow.png) no-repeat;
border: none;
cursor: pointer;
}
@ -441,7 +441,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-yellow,
.iradio_flat-yellow {
background-image: url(yellow@2x.png);
background-image: url(icheck-flat-imgs/yellow@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -457,7 +457,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(pink.png) no-repeat;
background: url(icheck-flat-imgs/pink.png) no-repeat;
border: none;
cursor: pointer;
}
@ -497,7 +497,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-pink,
.iradio_flat-pink {
background-image: url(pink@2x.png);
background-image: url(icheck-flat-imgs/pink@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}
@ -513,7 +513,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(purple.png) no-repeat;
background: url(icheck-flat-imgs/purple.png) no-repeat;
border: none;
cursor: pointer;
}
@ -553,7 +553,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-purple,
.iradio_flat-purple {
background-image: url(purple@2x.png);
background-image: url(icheck-flat-imgs/purple@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(aero.png) no-repeat;
background: url(icheck-flat-imgs/aero.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-aero,
.iradio_flat-aero {
background-image: url(aero@2x.png);
background-image: url(icheck-flat-imgs/aero@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(blue.png) no-repeat;
background: url(icheck-flat-imgs/blue.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-blue,
.iradio_flat-blue {
background-image: url(blue@2x.png);
background-image: url(icheck-flat-imgs/blue@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(flat.png) no-repeat;
background: url(icheck-flat-imgs/flat.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat,
.iradio_flat {
background-image: url(flat@2x.png);
background-image: url(icheck-flat-imgs/flat@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(green.png) no-repeat;
background: url(icheck-flat-imgs/green.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-green,
.iradio_flat-green {
background-image: url(green@2x.png);
background-image: url(icheck-flat-imgs/green@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(grey.png) no-repeat;
background: url(icheck-flat-imgs/grey.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-grey,
.iradio_flat-grey {
background-image: url(grey@2x.png);
background-image: url(icheck-flat-imgs/grey@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(orange.png) no-repeat;
background: url(icheck-flat-imgs/orange.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-orange,
.iradio_flat-orange {
background-image: url(orange@2x.png);
background-image: url(icheck-flat-imgs/orange@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(pink.png) no-repeat;
background: url(icheck-flat-imgs/pink.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-pink,
.iradio_flat-pink {
background-image: url(pink@2x.png);
background-image: url(icheck-flat-imgs/pink@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(purple.png) no-repeat;
background: url(icheck-flat-imgs/purple.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-purple,
.iradio_flat-purple {
background-image: url(purple@2x.png);
background-image: url(icheck-flat-imgs/purple@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(red.png) no-repeat;
background: url(icheck-flat-imgs/red.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-red,
.iradio_flat-red {
background-image: url(red@2x.png);
background-image: url(icheck-flat-imgs/red@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -9,7 +9,7 @@
padding: 0;
width: 20px;
height: 20px;
background: url(yellow.png) no-repeat;
background: url(icheck-flat-imgs/yellow.png) no-repeat;
border: none;
cursor: pointer;
}
@ -49,7 +49,7 @@
only screen and (min-device-pixel-ratio: 1.5) {
.icheckbox_flat-yellow,
.iradio_flat-yellow {
background-image: url(yellow@2x.png);
background-image: url(icheck-flat-imgs/yellow@2x.png);
-webkit-background-size: 176px 22px;
background-size: 176px 22px;
}

View File

@ -59,6 +59,11 @@
}.bind( this ) );
$( window ).bind( "touchend", function( e ) {
//COMUNIC FIX
if(!this.getCurrentRange)
return;
var isInside = ( editor.is( e.target ) || editor.has( e.target ).length > 0 ),
currentRange = this.getCurrentRange(),
clear = currentRange && ( currentRange.startContainer === currentRange.endContainer && currentRange.startOffset === currentRange.endOffset );

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 1013 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

62
assets/3rdparty/clippy.js/clippy.css vendored Normal file
View File

@ -0,0 +1,62 @@
.clippy, .clippy-balloon {
position: fixed;
z-index: 1000;
cursor: pointer;
}
.clippy-balloon {
background: #FFC;
color: black;
padding: 8px;
border: 1px solid black;
border-radius: 5px;
}
.clippy-content {
max-width: 200px;
min-width: 120px;
font-family: "Microsoft Sans", sans-serif;
font-size: 10pt;
}
.clippy-tip {
width: 10px;
height: 16px;
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAgCAMAAAAlvKiEAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAlQTFRF///MAAAA////52QwgAAAAAN0Uk5T//8A18oNQQAAAGxJREFUeNqs0kEOwCAIRFHn3//QTUU6xMyyxii+jQosrTPkyPEM6IN3FtzIRk1U4dFeKWQiH6pRRowMVKEmvronEynkwj0uZJgR22+YLopPSo9P34wJSamLSU7lSIWLJU7NkNomNlhqxUeAAQC+TQLZyEuJBwAAAABJRU5ErkJggg==) no-repeat;
position: absolute;
}
.clippy-top-left .clippy-tip {
top: 100%;
margin-top: 0px;
left: 100%;
margin-left: -50px;
}
.clippy-top-right .clippy-tip {
top: 100%;
margin-top: 0px;
left: 0;
margin-left: 50px;
background-position: -10px 0;
}
.clippy-bottom-right .clippy-tip {
top: 0;
margin-top: -16px;
left: 0;
margin-left: 50px;
background-position: -10px -16px;
}
.clippy-bottom-left .clippy-tip {
top: 0;
margin-top: -16px;
left: 100%;
margin-left: -50px;
background-position: 0px -16px;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,22 @@
MIT License
Copyright (c) 2020 Adam Shaw
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

11
assets/3rdparty/fullcalendar/README.md vendored Normal file
View File

@ -0,0 +1,11 @@
# FullCalendar [![Build Status](https://travis-ci.com/fullcalendar/fullcalendar.svg?branch=master)](https://travis-ci.com/fullcalendar/fullcalendar)
A full-sized drag & drop JavaScript event calendar
- [Project website and demos](http://fullcalendar.io/)
- [Documentation](http://fullcalendar.io/docs)
- [Support](http://fullcalendar.io/support)
- [Contributing](CONTRIBUTING.md)
- [Changelog](CHANGELOG.md)
- [License](LICENSE.txt)

View File

@ -0,0 +1,102 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
},
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
businessHours: true, // display business hours
editable: true,
selectable: true,
events: [
{
title: 'Business Lunch',
start: '2020-09-03T13:00:00',
constraint: 'businessHours'
},
{
title: 'Meeting',
start: '2020-09-13T11:00:00',
constraint: 'availableForMeeting', // defined below
color: '#257e4a'
},
{
title: 'Conference',
start: '2020-09-18',
end: '2020-09-20'
},
{
title: 'Party',
start: '2020-09-29T20:00:00'
},
// areas where "Meeting" must be dropped
{
groupId: 'availableForMeeting',
start: '2020-09-11T10:00:00',
end: '2020-09-11T16:00:00',
display: 'background'
},
{
groupId: 'availableForMeeting',
start: '2020-09-13T10:00:00',
end: '2020-09-13T16:00:00',
display: 'background'
},
// red areas where no events can be dropped
{
start: '2020-09-24',
end: '2020-09-28',
overlap: false,
display: 'background',
color: '#ff9f89'
},
{
start: '2020-09-06',
end: '2020-09-08',
overlap: false,
display: 'background',
color: '#ff9f89'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,105 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prevYear,prev,next,nextYear today',
center: 'title',
right: 'dayGridMonth,dayGridWeek,dayGridDay'
},
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
editable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,70 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var srcCalendarEl = document.getElementById('source-calendar');
var destCalendarEl = document.getElementById('destination-calendar');
var srcCalendar = new FullCalendar.Calendar(srcCalendarEl, {
editable: true,
initialDate: '2020-09-12',
events: [
{
title: 'event1',
start: '2020-09-11T10:00:00',
end: '2020-09-11T16:00:00'
},
{
title: 'event2',
start: '2020-09-13T10:00:00',
end: '2020-09-13T16:00:00'
}
],
eventLeave: function(info) {
console.log('event left!', info.event);
}
});
var destCalendar = new FullCalendar.Calendar(destCalendarEl, {
initialDate: '2020-09-12',
editable: true,
droppable: true, // will let it receive events!
eventReceive: function(info) {
console.log('event received!', info.event);
}
});
srcCalendar.render();
destCalendar.render();
});
</script>
<style>
body {
margin: 20px 0 0 20px;
font-size: 14px;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
}
#source-calendar,
#destination-calendar {
float: left;
width: 600px;
margin: 0 20px 20px 0;
}
</style>
</head>
<body>
<div id='source-calendar'></div>
<div id='destination-calendar'></div>
</body>
</html>

View File

@ -0,0 +1,150 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
/* initialize the external events
-----------------------------------------------------------------*/
var containerEl = document.getElementById('external-events-list');
new FullCalendar.Draggable(containerEl, {
itemSelector: '.fc-event',
eventData: function(eventEl) {
return {
title: eventEl.innerText.trim()
}
}
});
//// the individual way to do it
// var containerEl = document.getElementById('external-events-list');
// var eventEls = Array.prototype.slice.call(
// containerEl.querySelectorAll('.fc-event')
// );
// eventEls.forEach(function(eventEl) {
// new FullCalendar.Draggable(eventEl, {
// eventData: {
// title: eventEl.innerText.trim(),
// }
// });
// });
/* initialize the calendar
-----------------------------------------------------------------*/
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
editable: true,
droppable: true, // this allows things to be dropped onto the calendar
drop: function(arg) {
// is the "remove after drop" checkbox checked?
if (document.getElementById('drop-remove').checked) {
// if so, remove the element from the "Draggable Events" list
arg.draggedEl.parentNode.removeChild(arg.draggedEl);
}
}
});
calendar.render();
});
</script>
<style>
body {
margin-top: 40px;
font-size: 14px;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
}
#external-events {
position: fixed;
left: 20px;
top: 20px;
width: 150px;
padding: 0 10px;
border: 1px solid #ccc;
background: #eee;
text-align: left;
}
#external-events h4 {
font-size: 16px;
margin-top: 0;
padding-top: 1em;
}
#external-events .fc-event {
margin: 3px 0;
cursor: move;
}
#external-events p {
margin: 1.5em 0;
font-size: 11px;
color: #666;
}
#external-events p input {
margin: 0;
vertical-align: middle;
}
#calendar-wrap {
margin-left: 200px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='wrap'>
<div id='external-events'>
<h4>Draggable Events</h4>
<div id='external-events-list'>
<div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
<div class='fc-event-main'>My Event 1</div>
</div>
<div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
<div class='fc-event-main'>My Event 2</div>
</div>
<div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
<div class='fc-event-main'>My Event 3</div>
</div>
<div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
<div class='fc-event-main'>My Event 4</div>
</div>
<div class='fc-event fc-h-event fc-daygrid-event fc-daygrid-block-event'>
<div class='fc-event-main'>My Event 5</div>
</div>
</div>
<p>
<input type='checkbox' id='drop-remove' />
<label for='drop-remove'>remove after drop</label>
</p>
</div>
<div id='calendar-wrap'>
<div id='calendar'></div>
</div>
</div>
</body>
</html>

View File

@ -0,0 +1,126 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
height: '100%',
expandRows: true,
slotMinTime: '08:00',
slotMaxTime: '20:00',
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
initialView: 'dayGridMonth',
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
editable: true,
selectable: true,
nowIndicator: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01',
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
html, body {
overflow: hidden; /* don't do scrollbars */
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar-container {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.fc-header-toolbar {
/*
the calendar will be butting up against the edges,
but let's scoot in the header's buttons
*/
padding-top: 1em;
padding-left: 1em;
padding-right: 1em;
}
</style>
</head>
<body>
<div id='calendar-container'>
<div id='calendar'></div>
</div>
</body>
</html>

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,listYear'
},
displayEventTime: false, // don't show the time column in list view
// THIS KEY WON'T WORK IN PRODUCTION!!!
// To make your own Google API key, follow the directions here:
// http://fullcalendar.io/docs/google_calendar/
googleCalendarApiKey: 'AIzaSyDcnW6WejpTOCffshGDDb4neIrXVUA1EAE',
// US Holidays
events: 'en.usa#holiday@group.v.calendar.google.com',
eventClick: function(arg) {
// opens events in a popup window
window.open(arg.event.url, 'google-calendar-event', 'width=700,height=600');
arg.jsEvent.preventDefault() // don't navigate in main tab
},
loading: function(bool) {
document.getElementById('loading').style.display =
bool ? 'block' : 'none';
}
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#loading {
display: none;
position: absolute;
top: 10px;
right: 10px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='loading'>loading...</div>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,86 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='https://github.com/mozilla-comm/ical.js/releases/download/v1.4.0/ical.js'></script>
<script src='../lib/main.js'></script>
<script src='../packages/icalendar/main.global.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
displayEventTime: false,
initialDate: '2019-04-01',
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,listYear'
},
events: {
url: 'ics/feed.ics',
format: 'ics',
failure: function() {
document.getElementById('script-warning').style.display = 'block';
}
},
loading: function(bool) {
document.getElementById('loading').style.display =
bool ? 'block' : 'none';
}
});
calendar.render();
});
</script>
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#script-warning {
display: none;
background: #eee;
border-bottom: 1px solid #ddd;
padding: 0 10px;
line-height: 40px;
text-align: center;
font-weight: bold;
font-size: 12px;
color: red;
}
#loading {
display: none;
position: absolute;
top: 10px;
right: 10px;
}
#calendar {
max-width: 1100px;
margin: 40px auto;
padding: 0 10px;
}
</style>
</head>
<body>
<div id='script-warning'>
<code>ics/feed.ics</code> must be servable
</div>
<div id='loading'>loading...</div>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,141 @@
function initThemeChooser(settings) {
var isInitialized = false;
var currentThemeSystem; // don't set this directly. use setThemeSystem
var currentStylesheetEl;
var loadingEl = document.getElementById('loading');
var systemSelectEl = document.querySelector('#theme-system-selector select');
var themeSelectWrapEls = Array.prototype.slice.call( // convert to real array
document.querySelectorAll('.selector[data-theme-system]')
);
systemSelectEl.addEventListener('change', function() {
setThemeSystem(this.value);
});
setThemeSystem(systemSelectEl.value);
themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
var themeSelectEl = themeSelectWrapEl.querySelector('select');
themeSelectWrapEl.addEventListener('change', function() {
setTheme(
currentThemeSystem,
themeSelectEl.options[themeSelectEl.selectedIndex].value
);
});
});
function setThemeSystem(themeSystem) {
var selectedTheme;
currentThemeSystem = themeSystem;
themeSelectWrapEls.forEach(function(themeSelectWrapEl) {
var themeSelectEl = themeSelectWrapEl.querySelector('select');
if (themeSelectWrapEl.getAttribute('data-theme-system') === themeSystem) {
selectedTheme = themeSelectEl.options[themeSelectEl.selectedIndex].value;
themeSelectWrapEl.style.display = 'inline-block';
} else {
themeSelectWrapEl.style.display = 'none';
}
});
setTheme(themeSystem, selectedTheme);
}
function setTheme(themeSystem, themeName) {
var stylesheetUrl = generateStylesheetUrl(themeSystem, themeName);
var stylesheetEl;
function done() {
if (!isInitialized) {
isInitialized = true;
settings.init(themeSystem);
}
else {
settings.change(themeSystem);
}
showCredits(themeSystem, themeName);
}
if (stylesheetUrl) {
stylesheetEl = document.createElement('link');
stylesheetEl.setAttribute('rel', 'stylesheet');
stylesheetEl.setAttribute('href', stylesheetUrl);
document.querySelector('head').appendChild(stylesheetEl);
loadingEl.style.display = 'inline';
whenStylesheetLoaded(stylesheetEl, function() {
if (currentStylesheetEl) {
currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
}
currentStylesheetEl = stylesheetEl;
loadingEl.style.display = 'none';
done();
});
} else {
if (currentStylesheetEl) {
currentStylesheetEl.parentNode.removeChild(currentStylesheetEl);
currentStylesheetEl = null
}
done();
}
}
function generateStylesheetUrl(themeSystem, themeName) {
if (themeSystem === 'bootstrap') {
if (themeName) {
return 'https://bootswatch.com/4/' + themeName + '/bootstrap.min.css';
}
else { // the default bootstrap theme
return 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css';
}
}
}
function showCredits(themeSystem, themeName) {
var creditId;
if (themeSystem.match('bootstrap')) {
if (themeName) {
creditId = 'bootstrap-custom';
}
else {
creditId = 'bootstrap-standard';
}
}
Array.prototype.slice.call( // convert to real array
document.querySelectorAll('.credits')
).forEach(function(creditEl) {
if (creditEl.getAttribute('data-credit-id') === creditId) {
creditEl.style.display = 'block';
} else {
creditEl.style.display = 'none';
}
})
}
function whenStylesheetLoaded(linkNode, callback) {
var isReady = false;
function ready() {
if (!isReady) { // avoid double-call
isReady = true;
callback();
}
}
linkNode.onload = ready; // does not work cross-browser
setTimeout(ready, 2000); // max wait. also handles browsers that don't support onload
}
}

View File

@ -0,0 +1,85 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
initialDate: '2020-09-12',
editable: true,
navLinks: true, // can click day/week names to navigate views
dayMaxEvents: true, // allow "more" link when too many events
events: {
url: 'php/get-events.php',
failure: function() {
document.getElementById('script-warning').style.display = 'block'
}
},
loading: function(bool) {
document.getElementById('loading').style.display =
bool ? 'block' : 'none';
}
});
calendar.render();
});
</script>
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#script-warning {
display: none;
background: #eee;
border-bottom: 1px solid #ddd;
padding: 0 10px;
line-height: 40px;
text-align: center;
font-weight: bold;
font-size: 12px;
color: red;
}
#loading {
display: none;
position: absolute;
top: 10px;
right: 10px;
}
#calendar {
max-width: 1100px;
margin: 40px auto;
padding: 0 10px;
}
</style>
</head>
<body>
<div id='script-warning'>
<code>php/get-events.php</code> must be running.
</div>
<div id='loading'>loading...</div>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,56 @@
[
{
"title": "All Day Event",
"start": "2020-09-01"
},
{
"title": "Long Event",
"start": "2020-09-07",
"end": "2020-09-10"
},
{
"id": "999",
"title": "Repeating Event",
"start": "2020-09-09T16:00:00-05:00"
},
{
"id": "999",
"title": "Repeating Event",
"start": "2020-09-16T16:00:00-05:00"
},
{
"title": "Conference",
"start": "2020-09-11",
"end": "2020-09-13"
},
{
"title": "Meeting",
"start": "2020-09-12T10:30:00-05:00",
"end": "2020-09-12T12:30:00-05:00"
},
{
"title": "Lunch",
"start": "2020-09-12T12:00:00-05:00"
},
{
"title": "Meeting",
"start": "2020-09-12T14:30:00-05:00"
},
{
"title": "Happy Hour",
"start": "2020-09-12T17:30:00-05:00"
},
{
"title": "Dinner",
"start": "2020-09-12T20:00:00"
},
{
"title": "Birthday Party",
"start": "2020-09-13T07:00:00-05:00"
},
{
"title": "Click for Google",
"url": "http://google.com/",
"start": "2020-09-28"
}
]

View File

@ -0,0 +1,78 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
height: 'auto',
// stickyHeaderDates: false, // for disabling
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'listMonth,listYear'
},
// customize the button names,
// otherwise they'd all just say "list"
views: {
listMonth: { buttonText: 'list month' },
listYear: { buttonText: 'list year' }
},
initialView: 'listYear',
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
editable: true,
events: [
{
title: 'repeating event 1',
daysOfWeek: [ 1, 2, 3 ],
duration: '00:30'
},
{
title: 'repeating event 2',
daysOfWeek: [ 1, 2, 3 ],
duration: '00:30'
},
{
title: 'repeating event 3',
daysOfWeek: [ 1, 2, 3 ],
duration: '00:30'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'listDay,listWeek'
},
// customize the button names,
// otherwise they'd all just say "list"
views: {
listDay: { buttonText: 'list day' },
listWeek: { buttonText: 'list week' }
},
initialView: 'listWeek',
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
editable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,144 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script src='../lib/locales-all.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var initialLocaleCode = 'en';
var localeSelectorEl = document.getElementById('locale-selector');
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
},
initialDate: '2020-09-12',
locale: initialLocaleCode,
buttonIcons: false, // show the prev/next text
weekNumbers: true,
navLinks: true, // can click day/week names to navigate views
editable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
// build the locale selector's options
calendar.getAvailableLocaleCodes().forEach(function(localeCode) {
var optionEl = document.createElement('option');
optionEl.value = localeCode;
optionEl.selected = localeCode == initialLocaleCode;
optionEl.innerText = localeCode;
localeSelectorEl.appendChild(optionEl);
});
// when the selected option changes, dynamically change the calendar option
localeSelectorEl.addEventListener('change', function() {
if (this.value) {
calendar.setOption('locale', this.value);
}
});
});
</script>
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#top {
background: #eee;
border-bottom: 1px solid #ddd;
padding: 0 10px;
line-height: 40px;
font-size: 12px;
}
#calendar {
max-width: 1100px;
margin: 40px auto;
padding: 0 10px;
}
</style>
</head>
<body>
<div id='top'>
Locales:
<select id='locale-selector'></select>
</div>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,101 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialDate: '2020-09-12',
editable: true,
selectable: true,
businessHours: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,109 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialDate: '2020-09-12',
initialView: 'timeGridWeek',
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
height: 'auto',
navLinks: true, // can click day/week names to navigate views
editable: true,
selectable: true,
selectMirror: true,
nowIndicator: true,
events: [
{
title: 'All Day Event',
start: '2020-09-01',
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,50 @@
<?php
//--------------------------------------------------------------------------------------------------
// This script reads event data from a JSON file and outputs those events which are within the range
// supplied by the "start" and "end" GET parameters.
//
// An optional "timeZone" GET parameter will force all ISO8601 date stings to a given timeZone.
//
// Requires PHP 5.2.0 or higher.
//--------------------------------------------------------------------------------------------------
// Require our Event class and datetime utilities
require dirname(__FILE__) . '/utils.php';
// Short-circuit if the client did not give us a date range.
if (!isset($_GET['start']) || !isset($_GET['end'])) {
die("Please provide a date range.");
}
// Parse the start/end parameters.
// These are assumed to be ISO8601 strings with no time nor timeZone, like "2013-12-29".
// Since no timeZone will be present, they will parsed as UTC.
$range_start = parseDateTime($_GET['start']);
$range_end = parseDateTime($_GET['end']);
// Parse the timeZone parameter if it is present.
$time_zone = null;
if (isset($_GET['timeZone'])) {
$time_zone = new DateTimeZone($_GET['timeZone']);
}
// Read and parse our events JSON file into an array of event data arrays.
$json = file_get_contents(dirname(__FILE__) . '/../json/events.json');
$input_arrays = json_decode($json, true);
// Accumulate an output array of event data arrays.
$output_arrays = array();
foreach ($input_arrays as $array) {
// Convert the input array into a useful Event object
$event = new Event($array, $time_zone);
// If the event is in-bounds, add it to the output
if ($event->isWithinDayRange($range_start, $range_end)) {
$output_arrays[] = $event->toArray();
}
}
// Send JSON to the client.
echo json_encode($output_arrays);

View File

@ -0,0 +1,9 @@
<?php
//--------------------------------------------------------------------------------------------------
// This script outputs a JSON array of all timezones (like "America/Chicago") that PHP supports.
//
// Requires PHP 5.2.0 or higher.
//--------------------------------------------------------------------------------------------------
echo json_encode(DateTimeZone::listIdentifiers());

View File

@ -0,0 +1,130 @@
<?php
//--------------------------------------------------------------------------------------------------
// Utilities for our event-fetching scripts.
//
// Requires PHP 5.2.0 or higher.
//--------------------------------------------------------------------------------------------------
// PHP will fatal error if we attempt to use the DateTime class without this being set.
date_default_timezone_set('UTC');
class Event {
// Tests whether the given ISO8601 string has a time-of-day or not
const ALL_DAY_REGEX = '/^\d{4}-\d\d-\d\d$/'; // matches strings like "2013-12-29"
public $title;
public $allDay; // a boolean
public $start; // a DateTime
public $end; // a DateTime, or null
public $properties = array(); // an array of other misc properties
// Constructs an Event object from the given array of key=>values.
// You can optionally force the timeZone of the parsed dates.
public function __construct($array, $timeZone=null) {
$this->title = $array['title'];
if (isset($array['allDay'])) {
// allDay has been explicitly specified
$this->allDay = (bool)$array['allDay'];
}
else {
// Guess allDay based off of ISO8601 date strings
$this->allDay = preg_match(self::ALL_DAY_REGEX, $array['start']) &&
(!isset($array['end']) || preg_match(self::ALL_DAY_REGEX, $array['end']));
}
if ($this->allDay) {
// If dates are allDay, we want to parse them in UTC to avoid DST issues.
$timeZone = null;
}
// Parse dates
$this->start = parseDateTime($array['start'], $timeZone);
$this->end = isset($array['end']) ? parseDateTime($array['end'], $timeZone) : null;
// Record misc properties
foreach ($array as $name => $value) {
if (!in_array($name, array('title', 'allDay', 'start', 'end'))) {
$this->properties[$name] = $value;
}
}
}
// Returns whether the date range of our event intersects with the given all-day range.
// $rangeStart and $rangeEnd are assumed to be dates in UTC with 00:00:00 time.
public function isWithinDayRange($rangeStart, $rangeEnd) {
// Normalize our event's dates for comparison with the all-day range.
$eventStart = stripTime($this->start);
if (isset($this->end)) {
$eventEnd = stripTime($this->end); // normalize
}
else {
$eventEnd = $eventStart; // consider this a zero-duration event
}
// Check if the two whole-day ranges intersect.
return $eventStart < $rangeEnd && $eventEnd >= $rangeStart;
}
// Converts this Event object back to a plain data array, to be used for generating JSON
public function toArray() {
// Start with the misc properties (don't worry, PHP won't affect the original array)
$array = $this->properties;
$array['title'] = $this->title;
// Figure out the date format. This essentially encodes allDay into the date string.
if ($this->allDay) {
$format = 'Y-m-d'; // output like "2013-12-29"
}
else {
$format = 'c'; // full ISO8601 output, like "2013-12-29T09:00:00+08:00"
}
// Serialize dates into strings
$array['start'] = $this->start->format($format);
if (isset($this->end)) {
$array['end'] = $this->end->format($format);
}
return $array;
}
}
// Date Utilities
//----------------------------------------------------------------------------------------------
// Parses a string into a DateTime object, optionally forced into the given timeZone.
function parseDateTime($string, $timeZone=null) {
$date = new DateTime(
$string,
$timeZone ? $timeZone : new DateTimeZone('UTC')
// Used only when the string is ambiguous.
// Ignored if string has a timeZone offset in it.
);
if ($timeZone) {
// If our timeZone was ignored above, force it.
$date->setTimezone($timeZone);
}
return $date;
}
// Takes the year/month/date values of the given DateTime and converts them to a new DateTime,
// but in UTC.
function stripTime($datetime) {
return new DateTime($datetime->format('Y-m-d'));
}

View File

@ -0,0 +1,124 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay'
},
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
selectable: true,
selectMirror: true,
select: function(arg) {
var title = prompt('Event Title:');
if (title) {
calendar.addEvent({
title: title,
start: arg.start,
end: arg.end,
allDay: arg.allDay
})
}
calendar.unselect()
},
eventClick: function(arg) {
if (confirm('Are you sure you want to delete this event?')) {
arg.event.remove()
}
},
editable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,212 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='https://use.fontawesome.com/releases/v5.0.6/css/all.css' rel='stylesheet'>
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script src='js/theme-chooser.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar;
initThemeChooser({
init: function(themeSystem) {
calendar = new FullCalendar.Calendar(calendarEl, {
themeSystem: themeSystem,
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listMonth'
},
initialDate: '2020-09-12',
weekNumbers: true,
navLinks: true, // can click day/week names to navigate views
editable: true,
selectable: true,
nowIndicator: true,
dayMaxEvents: true, // allow "more" link when too many events
// showNonCurrentDates: false,
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
},
change: function(themeSystem) {
calendar.setOption('themeSystem', themeSystem);
}
});
});
</script>
<style>
body {
margin: 0;
padding: 0;
font-size: 14px;
}
#top,
#calendar.fc-theme-standard {
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
}
#calendar.fc-theme-bootstrap {
font-size: 14px;
}
#top {
background: #eee;
border-bottom: 1px solid #ddd;
padding: 0 10px;
line-height: 40px;
font-size: 12px;
color: #000;
}
#top .selector {
display: inline-block;
margin-right: 10px;
}
#top select {
font: inherit; /* mock what Boostrap does, don't compete */
}
.left { float: left }
.right { float: right }
.clear { clear: both }
#calendar {
max-width: 1100px;
margin: 40px auto;
padding: 0 10px;
}
</style>
</head>
<body>
<div id='top'>
<div class='left'>
<div id='theme-system-selector' class='selector'>
Theme System:
<select>
<option value='bootstrap' selected>Bootstrap 4</option>
<option value='standard'>unthemed</option>
</select>
</div>
<div data-theme-system="bootstrap" class='selector' style='display:none'>
Theme Name:
<select>
<option value='' selected>Default</option>
<option value='cerulean'>Cerulean</option>
<option value='cosmo'>Cosmo</option>
<option value='cyborg'>Cyborg</option>
<option value='darkly'>Darkly</option>
<option value='flatly'>Flatly</option>
<option value='journal'>Journal</option>
<option value='litera'>Litera</option>
<option value='lumen'>Lumen</option>
<option value='lux'>Lux</option>
<option value='materia'>Materia</option>
<option value='minty'>Minty</option>
<option value='pulse'>Pulse</option>
<option value='sandstone'>Sandstone</option>
<option value='simplex'>Simplex</option>
<option value='sketchy'>Sketchy</option>
<option value='slate'>Slate</option>
<option value='solar'>Solar</option>
<option value='spacelab'>Spacelab</option>
<option value='superhero'>Superhero</option>
<option value='united'>United</option>
<option value='yeti'>Yeti</option>
</select>
</div>
<span id='loading' style='display:none'>loading theme...</span>
</div>
<div class='right'>
<span class='credits' data-credit-id='bootstrap-standard' style='display:none'>
<a href='https://getbootstrap.com/docs/3.3/' target='_blank'>Theme by Bootstrap</a>
</span>
<span class='credits' data-credit-id='bootstrap-custom' style='display:none'>
<a href='https://bootswatch.com/' target='_blank'>Theme by Bootswatch</a>
</span>
</div>
<div class='clear'></div>
</div>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,137 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var initialTimeZone = 'local';
var timeZoneSelectorEl = document.getElementById('time-zone-selector');
var loadingEl = document.getElementById('loading');
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
timeZone: initialTimeZone,
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
editable: true,
selectable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: {
url: 'php/get-events.php',
failure: function() {
document.getElementById('script-warning').style.display = 'inline'; // show
}
},
loading: function(bool) {
if (bool) {
loadingEl.style.display = 'inline'; // show
} else {
loadingEl.style.display = 'none'; // hide
}
},
eventTimeFormat: { hour: 'numeric', minute: '2-digit', timeZoneName: 'short' },
dateClick: function(arg) {
console.log('dateClick', calendar.formatIso(arg.date));
},
select: function(arg) {
console.log('select', calendar.formatIso(arg.start), calendar.formatIso(arg.end));
}
});
calendar.render();
// load the list of available timezones, build the <select> options
// it's HIGHLY recommended to use a different library for network requests, not this internal util func
FullCalendar.requestJson('GET', 'php/get-time-zones.php', {}, function(timeZones) {
timeZones.forEach(function(timeZone) {
var optionEl;
if (timeZone !== 'UTC') { // UTC is already in the list
optionEl = document.createElement('option');
optionEl.value = timeZone;
optionEl.innerText = timeZone;
timeZoneSelectorEl.appendChild(optionEl);
}
});
}, function() {
// TODO: handle error
});
// when the timezone selector changes, dynamically change the calendar option
timeZoneSelectorEl.addEventListener('change', function() {
calendar.setOption('timeZone', this.value);
});
});
</script>
<style>
body {
margin: 0;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#top {
background: #eee;
border-bottom: 1px solid #ddd;
padding: 0 10px;
line-height: 40px;
font-size: 12px;
}
.left { float: left }
.right { float: right }
.clear { clear: both }
#script-warning, #loading { display: none }
#script-warning { font-weight: bold; color: red }
#calendar {
max-width: 1100px;
margin: 40px auto;
padding: 0 10px;
}
.tzo {
color: #000;
}
</style>
</head>
<body>
<div id='top'>
<div class='left'>
Timezone:
<select id='time-zone-selector'>
<option value='local' selected>local</option>
<option value='UTC'>UTC</option>
</select>
</div>
<div class='right'>
<span id='loading'>loading...</span>
<span id='script-warning'><code>php/get-events.php</code> must be running.</span>
</div>
<div class='clear'></div>
</div>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,122 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
height: 'auto', // enough to active sticky headers
dayMinWidth: 200,
slotDuration: '00:05:00',
initialDate: '2020-09-12',
initialView: 'timeGridWeek',
nowIndicator: true,
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
navLinks: true, // can click day/week names to navigate views
editable: true,
selectable: true,
selectMirror: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01',
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
text-align: center;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<p style='margin-bottom: 5em'>
Demo for sticky header. Also, the bottom scrollbars stick.
</p>
<div id='calendar'></div>
<p style='margin-top: 5em'>
Cool, right?
</p>
</body>
</html>

View File

@ -0,0 +1,107 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
dayMinWidth: 200,
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
initialDate: '2020-09-12',
initialView: 'timeGridWeek',
navLinks: true, // can click day/week names to navigate views
editable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01',
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,109 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
initialDate: '2020-09-12',
initialView: 'timeGridWeek',
nowIndicator: true,
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
navLinks: true, // can click day/week names to navigate views
editable: true,
selectable: true,
selectMirror: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01',
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

View File

@ -0,0 +1,111 @@
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8' />
<link href='../lib/main.css' rel='stylesheet' />
<script src='../lib/main.js'></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var calendarEl = document.getElementById('calendar');
var calendar = new FullCalendar.Calendar(calendarEl, {
headerToolbar: {
left: 'prev,next today',
center: 'title',
right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek'
},
initialDate: '2020-09-12',
navLinks: true, // can click day/week names to navigate views
nowIndicator: true,
weekNumbers: true,
weekNumberCalculation: 'ISO',
editable: true,
selectable: true,
dayMaxEvents: true, // allow "more" link when too many events
events: [
{
title: 'All Day Event',
start: '2020-09-01'
},
{
title: 'Long Event',
start: '2020-09-07',
end: '2020-09-10'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-09T16:00:00'
},
{
groupId: 999,
title: 'Repeating Event',
start: '2020-09-16T16:00:00'
},
{
title: 'Conference',
start: '2020-09-11',
end: '2020-09-13'
},
{
title: 'Meeting',
start: '2020-09-12T10:30:00',
end: '2020-09-12T12:30:00'
},
{
title: 'Lunch',
start: '2020-09-12T12:00:00'
},
{
title: 'Meeting',
start: '2020-09-12T14:30:00'
},
{
title: 'Happy Hour',
start: '2020-09-12T17:30:00'
},
{
title: 'Dinner',
start: '2020-09-12T20:00:00'
},
{
title: 'Birthday Party',
start: '2020-09-13T07:00:00'
},
{
title: 'Click for Google',
url: 'http://google.com/',
start: '2020-09-28'
}
]
});
calendar.render();
});
</script>
<style>
body {
margin: 40px 10px;
padding: 0;
font-family: Arial, Helvetica Neue, Helvetica, sans-serif;
font-size: 14px;
}
#calendar {
max-width: 1100px;
margin: 0 auto;
}
</style>
</head>
<body>
<div id='calendar'></div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var af = {
code: 'af',
week: {
dow: 1, // Maandag is die eerste dag van die week.
doy: 4, // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
},
buttonText: {
prev: 'Vorige',
next: 'Volgende',
today: 'Vandag',
year: 'Jaar',
month: 'Maand',
week: 'Week',
day: 'Dag',
list: 'Agenda',
},
allDayText: 'Heeldag',
moreLinkText: 'Addisionele',
noEventsText: 'Daar is geen gebeurtenisse nie',
};
return af;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arDz = {
code: 'ar-dz',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 4, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arDz;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arKw = {
code: 'ar-kw',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arKw;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arLy = {
code: 'ar-ly',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arLy;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arMa = {
code: 'ar-ma',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arMa;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arSa = {
code: 'ar-sa',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 6, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arSa;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var arTn = {
code: 'ar-tn',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return arTn;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ar = {
code: 'ar',
week: {
dow: 6, // Saturday is the first day of the week.
doy: 12, // The week that contains Jan 1st is the first week of the year.
},
direction: 'rtl',
buttonText: {
prev: 'السابق',
next: 'التالي',
today: 'اليوم',
month: 'شهر',
week: 'أسبوع',
day: 'يوم',
list: 'أجندة',
},
weekText: 'أسبوع',
allDayText: 'اليوم كله',
moreLinkText: 'أخرى',
noEventsText: 'أي أحداث لعرض',
};
return ar;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var az = {
code: 'az',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Əvvəl',
next: 'Sonra',
today: 'Bu Gün',
month: 'Ay',
week: 'Həftə',
day: 'Gün',
list: 'Gündəm',
},
weekText: 'Həftə',
allDayText: 'Bütün Gün',
moreLinkText: function(n) {
return '+ daha çox ' + n
},
noEventsText: 'Göstərmək üçün hadisə yoxdur',
};
return az;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var bg = {
code: 'bg',
week: {
dow: 1, // Monday is the first day of the week.
doy: 7, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'назад',
next: 'напред',
today: 'днес',
month: 'Месец',
week: 'Седмица',
day: 'Ден',
list: 'График',
},
allDayText: 'Цял ден',
moreLinkText: function(n) {
return '+още ' + n
},
noEventsText: 'Няма събития за показване',
};
return bg;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var bn = {
code: 'bn',
week: {
dow: 0, // Sunday is the first day of the week.
doy: 6, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'পেছনে',
next: 'সামনে',
today: 'আজ',
month: 'মাস',
week: 'সপ্তাহ',
day: 'দিন',
list: 'তালিকা',
},
weekText: 'সপ্তাহ',
allDayText: 'সারাদিন',
moreLinkText: function(n) {
return '+অন্যান্য ' + n
},
noEventsText: 'কোনো ইভেন্ট নেই',
};
return bn;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var bs = {
code: 'bs',
week: {
dow: 1, // Monday is the first day of the week.
doy: 7, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'Prošli',
next: 'Sljedeći',
today: 'Danas',
month: 'Mjesec',
week: 'Sedmica',
day: 'Dan',
list: 'Raspored',
},
weekText: 'Sed',
allDayText: 'Cijeli dan',
moreLinkText: function(n) {
return '+ još ' + n
},
noEventsText: 'Nema događaja za prikazivanje',
};
return bs;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ca = {
code: 'ca',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Anterior',
next: 'Següent',
today: 'Avui',
month: 'Mes',
week: 'Setmana',
day: 'Dia',
list: 'Agenda',
},
weekText: 'Set',
allDayText: 'Tot el dia',
moreLinkText: 'més',
noEventsText: 'No hi ha esdeveniments per mostrar',
};
return ca;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var cs = {
code: 'cs',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Dříve',
next: 'Později',
today: 'Nyní',
month: 'Měsíc',
week: 'Týden',
day: 'Den',
list: 'Agenda',
},
weekText: 'Týd',
allDayText: 'Celý den',
moreLinkText: function(n) {
return '+další: ' + n
},
noEventsText: 'Žádné akce k zobrazení',
};
return cs;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var cy = {
code: 'cy',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Blaenorol',
next: 'Nesaf',
today: 'Heddiw',
year: 'Blwyddyn',
month: 'Mis',
week: 'Wythnos',
day: 'Dydd',
list: 'Rhestr',
},
weekText: 'Wythnos',
allDayText: 'Trwy\'r dydd',
moreLinkText: 'Mwy',
noEventsText: 'Dim digwyddiadau',
};
return cy;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var da = {
code: 'da',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Forrige',
next: 'Næste',
today: 'I dag',
month: 'Måned',
week: 'Uge',
day: 'Dag',
list: 'Agenda',
},
weekText: 'Uge',
allDayText: 'Hele dagen',
moreLinkText: 'flere',
noEventsText: 'Ingen arrangementer at vise',
};
return da;
}());

View File

@ -0,0 +1,30 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var deAt = {
code: 'de-at',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Zurück',
next: 'Vor',
today: 'Heute',
year: 'Jahr',
month: 'Monat',
week: 'Woche',
day: 'Tag',
list: 'Terminübersicht',
},
weekText: 'KW',
allDayText: 'Ganztägig',
moreLinkText: function(n) {
return '+ weitere ' + n
},
noEventsText: 'Keine Ereignisse anzuzeigen',
};
return deAt;
}());

View File

@ -0,0 +1,30 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var de = {
code: 'de',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4th is the first week of the year.
},
buttonText: {
prev: 'Zurück',
next: 'Vor',
today: 'Heute',
year: 'Jahr',
month: 'Monat',
week: 'Woche',
day: 'Tag',
list: 'Terminübersicht',
},
weekText: 'KW',
allDayText: 'Ganztägig',
moreLinkText: function(n) {
return '+ weitere ' + n
},
noEventsText: 'Keine Ereignisse anzuzeigen',
};
return de;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var el = {
code: 'el',
week: {
dow: 1, // Monday is the first day of the week.
doy: 4, // The week that contains Jan 4st is the first week of the year.
},
buttonText: {
prev: 'Προηγούμενος',
next: 'Επόμενος',
today: 'Σήμερα',
month: 'Μήνας',
week: 'Εβδομάδα',
day: 'Ημέρα',
list: 'Ατζέντα',
},
weekText: 'Εβδ',
allDayText: 'Ολοήμερο',
moreLinkText: 'περισσότερα',
noEventsText: 'Δεν υπάρχουν γεγονότα προς εμφάνιση',
};
return el;
}());

Some files were not shown because too many files have changed in this diff Show More