Compare commits

...

391 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
310 changed files with 45501 additions and 4801 deletions

1
.gitignore vendored
View File

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

View File

@ -29,4 +29,6 @@ ComunicWeb would not exists without the following technologies developped by the
- 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)
- SimplePeer (https://github.com/feross/simple-peer) (MIT License)
- TensorFlow JS
- TensorFlow Models

File diff suppressed because one or more lines are too long

View File

@ -1,262 +0,0 @@
/**
* Signal exchanger web client
*
* @author Pierre HUBERT
*/
class SignalExchangerClient {
/**
* Server domain
*
* @type {String}
*/
//domain;
/**
* Server port
*
* @type {Number}
*/
//port;
/**
* Current client ID
*
* @type {String}
*/
//clientID;
/**
* Socket connection to the server
*
* @type {WebSocket}
*/
//socket;
/**
* Function called in case of error
*
* @type {Function}
*/
//onError = null;
/**
* Function called when the connection is etablished
*
* @type {Function}
*/
//onConnected = null;
/**
* Function called when the connection to the socket is closed
*
* @type {Function}
*/
//onClosed = null;
/**
* Function called when we get a new signal information
*
* @type {Function}
*/
//onSignal = null;
/**
* Function called when we get a ready message notice
*
* @type {Function}
*/
//onReadyMessage = null;
/**
* Construct a client instance
*
* @param {String} domain The name of the signal server
* @param {Number} port The port of the server to use
* @param {String} clientID The ID of current client
* @param {Boolean} secure Specify whether connection to the socket should be secure or not
*/
constructor(domain, port, clientID, secure) {
//Save information
this.domain = domain,
this.port = port;
this.clientID = clientID;
this.socket = new WebSocket((secure ? "wss" : "ws") + "://" + this.domain + ":" + this.port + "/socket");
//Add a few events listeners
this.socket.addEventListener("open", () => {
this.serverConnected();
if(this.onConnected != null)
setTimeout(this.onConnected, 10);
});
this.socket.addEventListener("message", message => {
let data;
try {
data = JSON.parse(message.data);
} catch(e){
console.error("Could not parse message from server!");
return;
}
console.log("New message from socket", data);
this.serverMessage(data);
});
this.socket.addEventListener("error", () => {
if(this.onError != null)
setTimeout(this.onError, 0);
});
this.socket.addEventListener("close", () => {
if(this.onClosed != null)
setTimeout(this.onClosed, 0);
});
}
/**
* Use this method to get the current connection status to the server
*
* @return {Boolean} TRUE if the client is connected to the server / FALSE else
*/
isConnected() {
return this.socket.readyState == WebSocket.OPEN;
}
/**
* Close the connection to the server (if connected)
*/
close() {
if(this.isConnected())
this.socket.close();
}
/**
* Method called once the client is successfully
* connected to the client
*/
serverConnected(){
//Send data to the server to identificate client
this.sendData({
client_id: this.clientID
});
}
/**
* Send ready message to a peer
*
* @param {String} peerID The ID of the target peer for the message
*/
sendReadyMessage(peerID){
this.sendData({
ready_msg: true,
target_id: peerID
});
}
/**
* Send a signal to the server
*
* @param target_id The ID of the target for the signal
* @param content Signal to send to the target
*/
sendSignal(target_id, content){
//Send directly the message to the server
this.sendData({
signal: content,
target_id: target_id
});
//Save the current signal being sent to be able to send
//it again in case of failure
this.pending_signal = content;
this.pending_signal_target = target_id;
}
/**
* Stop to try to send the current signal message in queue
*
* This does not cancel the sending of messages already sent through
* socket
*/
cancelCurrentSignal() {
this.pending_signal = undefined;
this.pending_signal_target = undefined;
}
/**
* Send data to the server
*
* @param {Object} data The data to send to the server
*/
sendData(data){
console.log("Sending data to server", data);
this.socket.send(JSON.stringify(data));
}
/**
* This method is called when the server has sent a new message to this client
*
* @param {Object} message The message sent by the server, as a JSON object
*/
serverMessage(message){
//Check if it is a callback for a pending message
if(message.signal_sent){
if(message.number_of_targets < 1 && this.pending_signal && this.pending_signal_target){
//We have to send the message again
setTimeout(() => {
this.sendSignal(this.pending_signal, this.pending_signal_target);
}, 1000);
}
else {
//Else we can remove from this class information about the signal being sent
this.cancelCurrentSignal();
}
}
//Check if message is a callback for a ready notice
else if(message.ready_message_sent){
if(message.number_of_targets < 1){
//Try to send message again
setTimeout(() => {
this.sendReadyMessage(message.target_id);
}, 1000);
}
}
// Check if message is a ready notice
else if(message.ready_msg){
if(this.onReadyMessage != null)
this.onReadyMessage(message.source_id);
}
// Check if the message is a signal
else if(message.signal){
if(this.onSignal != null)
this.onSignal(message.signal, message.source_id);
}
}
}

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

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;
}());

View File

@ -0,0 +1,14 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var enAu = {
code: 'en-au',
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.
},
};
return enAu;
}());

View File

@ -0,0 +1,14 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var enGb = {
code: 'en-gb',
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.
},
};
return enGb;
}());

View File

@ -0,0 +1,14 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var enNz = {
code: 'en-nz',
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.
},
};
return enNz;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var eo = {
code: 'eo',
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: 'Antaŭa',
next: 'Sekva',
today: 'Hodiaŭ',
month: 'Monato',
week: 'Semajno',
day: 'Tago',
list: 'Tagordo',
},
weekText: 'Sm',
allDayText: 'Tuta tago',
moreLinkText: 'pli',
noEventsText: 'Neniuj eventoj por montri',
};
return eo;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var esUs = {
code: 'es',
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: 'Ant',
next: 'Sig',
today: 'Hoy',
month: 'Mes',
week: 'Semana',
day: 'Día',
list: 'Agenda',
},
weekText: 'Sm',
allDayText: 'Todo el día',
moreLinkText: 'más',
noEventsText: 'No hay eventos para mostrar',
};
return esUs;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var es = {
code: 'es',
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: 'Ant',
next: 'Sig',
today: 'Hoy',
month: 'Mes',
week: 'Semana',
day: 'Día',
list: 'Agenda',
},
weekText: 'Sm',
allDayText: 'Todo el día',
moreLinkText: 'más',
noEventsText: 'No hay eventos para mostrar',
};
return es;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var et = {
code: 'et',
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: 'Eelnev',
next: 'Järgnev',
today: 'Täna',
month: 'Kuu',
week: 'Nädal',
day: 'Päev',
list: 'Päevakord',
},
weekText: 'näd',
allDayText: 'Kogu päev',
moreLinkText: function(n) {
return '+ veel ' + n
},
noEventsText: 'Kuvamiseks puuduvad sündmused',
};
return et;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var eu = {
code: 'eu',
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: 'Aur',
next: 'Hur',
today: 'Gaur',
month: 'Hilabetea',
week: 'Astea',
day: 'Eguna',
list: 'Agenda',
},
weekText: 'As',
allDayText: 'Egun osoa',
moreLinkText: 'gehiago',
noEventsText: 'Ez dago ekitaldirik erakusteko',
};
return eu;
}());

View File

@ -0,0 +1,30 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var fa = {
code: 'fa',
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: function(n) {
return 'بیش از ' + n
},
noEventsText: 'هیچ رویدادی به نمایش',
};
return fa;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var fi = {
code: 'fi',
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: 'Edellinen',
next: 'Seuraava',
today: 'Tänään',
month: 'Kuukausi',
week: 'Viikko',
day: 'Päivä',
list: 'Tapahtumat',
},
weekText: 'Vk',
allDayText: 'Koko päivä',
moreLinkText: 'lisää',
noEventsText: 'Ei näytettäviä tapahtumia',
};
return fi;
}());

View File

@ -0,0 +1,24 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var frCa = {
code: 'fr',
buttonText: {
prev: 'Précédent',
next: 'Suivant',
today: "Aujourd'hui",
year: 'Année',
month: 'Mois',
week: 'Semaine',
day: 'Jour',
list: 'Mon planning',
},
weekText: 'Sem.',
allDayText: 'Toute la journée',
moreLinkText: 'en plus',
noEventsText: 'Aucun événement à afficher',
};
return frCa;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var frCh = {
code: 'fr-ch',
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: 'Précédent',
next: 'Suivant',
today: 'Courant',
year: 'Année',
month: 'Mois',
week: 'Semaine',
day: 'Jour',
list: 'Mon planning',
},
weekText: 'Sm',
allDayText: 'Toute la journée',
moreLinkText: 'en plus',
noEventsText: 'Aucun événement à afficher',
};
return frCh;
}());

View File

@ -0,0 +1,28 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var fr = {
code: 'fr',
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: 'Précédent',
next: 'Suivant',
today: "Aujourd'hui",
year: 'Année',
month: 'Mois',
week: 'Semaine',
day: 'Jour',
list: 'Planning',
},
weekText: 'Sem.',
allDayText: 'Toute la journée',
moreLinkText: 'en plus',
noEventsText: 'Aucun événement à afficher',
};
return fr;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var gl = {
code: 'gl',
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: 'Ant',
next: 'Seg',
today: 'Hoxe',
month: 'Mes',
week: 'Semana',
day: 'Día',
list: 'Axenda',
},
weekText: 'Sm',
allDayText: 'Todo o día',
moreLinkText: 'máis',
noEventsText: 'Non hai eventos para amosar',
};
return gl;
}());

View File

@ -0,0 +1,24 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var he = {
code: 'he',
direction: 'rtl',
buttonText: {
prev: 'הקודם',
next: 'הבא',
today: 'היום',
month: 'חודש',
week: 'שבוע',
day: 'יום',
list: 'סדר יום',
},
allDayText: 'כל היום',
moreLinkText: 'אחר',
noEventsText: 'אין אירועים להצגה',
weekText: 'שבוע',
};
return he;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hi = {
code: 'hi',
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 hi;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hr = {
code: 'hr',
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: 'Prijašnji',
next: 'Sljedeći',
today: 'Danas',
month: 'Mjesec',
week: 'Tjedan',
day: 'Dan',
list: 'Raspored',
},
weekText: 'Tje',
allDayText: 'Cijeli dan',
moreLinkText: function(n) {
return '+ još ' + n
},
noEventsText: 'Nema događaja za prikaz',
};
return hr;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hu = {
code: 'hu',
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: 'vissza',
next: 'előre',
today: 'ma',
month: 'Hónap',
week: 'Hét',
day: 'Nap',
list: 'Napló',
},
weekText: 'Hét',
allDayText: 'Egész nap',
moreLinkText: 'további',
noEventsText: 'Nincs megjeleníthető esemény',
};
return hu;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var hyAm = {
code: 'hy-am',
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: 'Նախորդ',
next: 'Հաջորդ',
today: 'Այսօր',
month: 'Ամիս',
week: 'Շաբաթ',
day: 'Օր',
list: 'Օրվա ցուցակ',
},
weekText: 'Շաբ',
allDayText: 'Ամբողջ օր',
moreLinkText: function(n) {
return '+ ևս ' + n
},
noEventsText: 'Բացակայում է իրադարձությունը ցուցադրելու',
};
return hyAm;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var id = {
code: 'id',
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: 'mundur',
next: 'maju',
today: 'hari ini',
month: 'Bulan',
week: 'Minggu',
day: 'Hari',
list: 'Agenda',
},
weekText: 'Mg',
allDayText: 'Sehari penuh',
moreLinkText: 'lebih',
noEventsText: 'Tidak ada acara untuk ditampilkan',
};
return id;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var is = {
code: 'is',
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: 'Fyrri',
next: 'Næsti',
today: 'Í dag',
month: 'Mánuður',
week: 'Vika',
day: 'Dagur',
list: 'Dagskrá',
},
weekText: 'Vika',
allDayText: 'Allan daginn',
moreLinkText: 'meira',
noEventsText: 'Engir viðburðir til að sýna',
};
return is;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var it = {
code: 'it',
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: 'Prec',
next: 'Succ',
today: 'Oggi',
month: 'Mese',
week: 'Settimana',
day: 'Giorno',
list: 'Agenda',
},
weekText: 'Sm',
allDayText: 'Tutto il giorno',
moreLinkText: function(n) {
return '+altri ' + n
},
noEventsText: 'Non ci sono eventi da visualizzare',
};
return it;
}());

View File

@ -0,0 +1,25 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ja = {
code: 'ja',
buttonText: {
prev: '前',
next: '次',
today: '今日',
month: '月',
week: '週',
day: '日',
list: '予定リスト',
},
weekText: '週',
allDayText: '終日',
moreLinkText: function(n) {
return '他 ' + n + ' 件'
},
noEventsText: '表示する予定はありません',
};
return ja;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ka = {
code: 'ka',
week: {
dow: 1,
doy: 7,
},
buttonText: {
prev: 'წინა',
next: 'შემდეგი',
today: 'დღეს',
month: 'თვე',
week: 'კვირა',
day: 'დღე',
list: 'დღის წესრიგი',
},
weekText: 'კვ',
allDayText: 'მთელი დღე',
moreLinkText: function(n) {
return '+ კიდევ ' + n
},
noEventsText: 'ღონისძიებები არ არის',
};
return ka;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var kk = {
code: 'kk',
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: 'Күн тәртібі',
},
weekText: 'Не',
allDayText: 'Күні бойы',
moreLinkText: function(n) {
return '+ тағы ' + n
},
noEventsText: 'Көрсету үшін оқиғалар жоқ',
};
return kk;
}());

View File

@ -0,0 +1,23 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ko = {
code: 'ko',
buttonText: {
prev: '이전달',
next: '다음달',
today: '오늘',
month: '월',
week: '주',
day: '일',
list: '일정목록',
},
weekText: '주',
allDayText: '종일',
moreLinkText: '개',
noEventsText: '일정이 없습니다',
};
return ko;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var lb = {
code: 'lb',
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: 'Zréck',
next: 'Weider',
today: 'Haut',
month: 'Mount',
week: 'Woch',
day: 'Dag',
list: 'Terminiwwersiicht',
},
weekText: 'W',
allDayText: 'Ganzen Dag',
moreLinkText: 'méi',
noEventsText: 'Nee Evenementer ze affichéieren',
};
return lb;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var lt = {
code: 'lt',
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: 'Atgal',
next: 'Pirmyn',
today: 'Šiandien',
month: 'Mėnuo',
week: 'Savaitė',
day: 'Diena',
list: 'Darbotvarkė',
},
weekText: 'SAV',
allDayText: 'Visą dieną',
moreLinkText: 'daugiau',
noEventsText: 'Nėra įvykių rodyti',
};
return lt;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var lv = {
code: 'lv',
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: 'Iepr.',
next: 'Nāk.',
today: 'Šodien',
month: 'Mēnesis',
week: 'Nedēļa',
day: 'Diena',
list: 'Dienas kārtība',
},
weekText: 'Ned.',
allDayText: 'Visu dienu',
moreLinkText: function(n) {
return '+vēl ' + n
},
noEventsText: 'Nav notikumu',
};
return lv;
}());

View File

@ -0,0 +1,25 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var mk = {
code: 'mk',
buttonText: {
prev: 'претходно',
next: 'следно',
today: 'Денес',
month: 'Месец',
week: 'Недела',
day: 'Ден',
list: 'График',
},
weekText: 'Сед',
allDayText: 'Цел ден',
moreLinkText: function(n) {
return '+повеќе ' + n
},
noEventsText: 'Нема настани за прикажување',
};
return mk;
}());

View File

@ -0,0 +1,29 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ms = {
code: 'ms',
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: 'Sebelum',
next: 'Selepas',
today: 'hari ini',
month: 'Bulan',
week: 'Minggu',
day: 'Hari',
list: 'Agenda',
},
weekText: 'Mg',
allDayText: 'Sepanjang hari',
moreLinkText: function(n) {
return 'masih ada ' + n + ' acara'
},
noEventsText: 'Tiada peristiwa untuk dipaparkan',
};
return ms;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var nb = {
code: 'nb',
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: 'Neste',
today: 'I dag',
month: 'Måned',
week: 'Uke',
day: 'Dag',
list: 'Agenda',
},
weekText: 'Uke',
allDayText: 'Hele dagen',
moreLinkText: 'til',
noEventsText: 'Ingen hendelser å vise',
};
return nb;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var ne = {
code: 'ne', // code for nepal
week: {
dow: 7, // Sunday is the first day of the week.
doy: 1, // The week that contains Jan 1st is the first week of the year.
},
buttonText: {
prev: 'अघिल्लो',
next: 'अर्को',
today: 'आज',
month: 'महिना',
week: 'हप्ता',
day: 'दिन',
list: 'सूची',
},
weekText: 'हप्ता',
allDayText: 'दिनभरि',
moreLinkText: 'थप लिंक',
noEventsText: 'देखाउनको लागि कुनै घटनाहरू छैनन्',
};
return ne;
}());

View File

@ -0,0 +1,27 @@
FullCalendar.globalLocales.push(function () {
'use strict';
var nl = {
code: 'nl',
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: 'Vorige',
next: 'Volgende',
today: 'Vandaag',
year: 'Jaar',
month: 'Maand',
week: 'Week',
day: 'Dag',
list: 'Agenda',
},
allDayText: 'Hele dag',
moreLinkText: 'extra',
noEventsText: 'Geen evenementen om te laten zien',
};
return nl;
}());

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