浏览代码

Merge branch 'master' of github.com:tracim/tracim into feature/replywithmail

Guénaël Muller 7 年前
父节点
当前提交
1906b95633
共有 100 个文件被更改,包括 21331 次插入30 次删除
  1. 2 2
      README.md
  2. 3 3
      doc/database.md
  3. 2 2
      install/requirements.txt
  4. 0 3
      tracim/setup.py
  5. 5 5
      tracim/tracim/i18n/fr/LC_MESSAGES/tracim.po
  6. 2 2
      tracim/tracim/lib/daemons.py
  7. 4 3
      tracim/tracim/lib/email.py
  8. 2 6
      tracim/tracim/lib/notifications.py
  9. 6 4
      tracim/tracim/lib/webdav/design.py
  10. 56 0
      tracim/tracim/public/assets/candy/candy/CONTRIBUTING.md
  11. 9 0
      tracim/tracim/public/assets/candy/candy/CREDITS.md
  12. 9 0
      tracim/tracim/public/assets/candy/candy/LICENSE
  13. 28 0
      tracim/tracim/public/assets/candy/candy/README.md
  14. 41 0
      tracim/tracim/public/assets/candy/candy/bower.json
  15. 6680 0
      tracim/tracim/public/assets/candy/candy/candy.bundle.js
  16. 1 0
      tracim/tracim/public/assets/candy/candy/candy.bundle.map
  17. 5 0
      tracim/tracim/public/assets/candy/candy/candy.min.js
  18. 1 0
      tracim/tracim/public/assets/candy/candy/candy.min.map
  19. 4 0
      tracim/tracim/public/assets/candy/candy/example/htaccess
  20. 51 0
      tracim/tracim/public/assets/candy/candy/example/index.html
  21. 6760 0
      tracim/tracim/public/assets/candy/candy/libs.bundle.css
  22. 6782 0
      tracim/tracim/public/assets/candy/candy/libs.bundle.js
  23. 1 0
      tracim/tracim/public/assets/candy/candy/libs.bundle.map
  24. 5 0
      tracim/tracim/public/assets/candy/candy/libs.min.css
  25. 3 0
      tracim/tracim/public/assets/candy/candy/libs.min.js
  26. 65 0
      tracim/tracim/public/assets/candy/candy/package.json
  27. 802 0
      tracim/tracim/public/assets/candy/candy/res/default.css
  28. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/autoscroll-off.png
  29. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/autoscroll-on.png
  30. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/ban.png
  31. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/emoticons.png
  32. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/ignore.png
  33. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/kick.png
  34. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/menu.png
  35. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/private.png
  36. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/settings.png
  37. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/sound-off.png
  38. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/sound-on.png
  39. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/statusmessage-off.png
  40. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/statusmessage-on.png
  41. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/subject.png
  42. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/unignore.png
  43. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/action/usercount.png
  44. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Angel.png
  45. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Angry.png
  46. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Aww.png
  47. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Aww_2.png
  48. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Blushing.png
  49. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Childish.png
  50. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Confused.png
  51. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Creepy.png
  52. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Crying.png
  53. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Cthulhu.png
  54. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Cute.png
  55. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Cute_Winking.png
  56. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Devil.png
  57. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Gah.png
  58. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Gah_2.png
  59. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Gasping.png
  60. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Greedy.png
  61. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Grinning.png
  62. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Grinning_Winking.png
  63. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Happy.png
  64. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Happy_2.png
  65. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Happy_3.png
  66. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Heart.png
  67. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Huh.png
  68. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Huh_2.png
  69. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Laughing.png
  70. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Lips_Sealed.png
  71. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Madness.png
  72. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Malicious.png
  73. 2 0
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/README
  74. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Sick.png
  75. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Smiling.png
  76. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Speechless.png
  77. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Spiteful.png
  78. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Stupid.png
  79. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Sunglasses.png
  80. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Terrified.png
  81. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Thumb_Down.png
  82. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Thumb_Up.png
  83. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tired.png
  84. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out.png
  85. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Laughing.png
  86. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Left.png
  87. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Up.png
  88. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Up_Left.png
  89. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Winking.png
  90. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Uncertain.png
  91. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Uncertain_2.png
  92. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Unhappy.png
  93. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/emoticons/Winking.png
  94. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/favicon.png
  95. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/modal-spinner.gif
  96. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/overlay.png
  97. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/roster/affiliation-owner.png
  98. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/roster/ignore.png
  99. 二进制
      tracim/tracim/public/assets/candy/candy/res/img/roster/role-moderator.png
  100. 0 0
      tracim/tracim/public/assets/candy/candy/res/img/tab-transitions.png

+ 2 - 2
README.md 查看文件

@@ -102,7 +102,7 @@ If you want your own dedicated instance but do not want to manage it by yourself
102 102
 
103 103
 In case you prefer using Docker:
104 104
 
105
-    docker run -e DATABASE_TYPE=sqlite \
105
+    sudo docker run -e DATABASE_TYPE=sqlite \
106 106
                -p 80:80 -p 3030:3030 -p 5232:5232 \
107 107
                -v /var/tracim/etc:/etc/tracim -v /var/tracim/var:/var/tracim algoo/tracim
108 108
 
@@ -118,7 +118,7 @@ Following the installation documentation below, you'll be able to run your own i
118 118
 
119 119
 You'll need to install the following packages :
120 120
 
121
-    sudo apt install git realpath redis-server \
121
+    sudo apt install git curl realpath redis-server \
122 122
                      python3 python-virtualenv python3-dev python-pip  python-lxml \
123 123
                      build-essential libxml2-dev libxslt1-dev zlib1g-dev libjpeg-dev \
124 124
                      libmagickwand-6.q16-3

+ 3 - 3
doc/database.md 查看文件

@@ -57,8 +57,8 @@ Failure output:
57 57
 In this case, delete the user and database and start over:
58 58
 
59 59
     sudo --user=postgres psql \
60
-         --command="DROP USER tracimuser;" \
61
-         --command="DROP DATABASE tracimdb;"
60
+         --command="DROP DATABASE tracimdb;" \
61
+         --command="DROP USER tracimuser;"
62 62
 
63 63
 [//]: # (The following lines are only necessary to fix permissions on an existing database:)
64 64
 [//]: # (    sudo --user=postgres psql \)
@@ -88,7 +88,7 @@ Connect to `MySQL` with root user (password has been set at "Installation" -> "D
88 88
 
89 89
 Create a database with following command:
90 90
 
91
-    CREATE DATABASE tracimdb;
91
+    CREATE DATABASE tracimdb CHARACTER SET = utf8;
92 92
 
93 93
 Create a user with following command:
94 94
 

+ 2 - 2
install/requirements.txt 查看文件

@@ -17,7 +17,7 @@ WebTest==1.4.2
17 17
 alembic==0.8.4
18 18
 argparse==1.2.1
19 19
 backlash==0.0.7
20
-beautifulsoup4==4.4.0
20
+beautifulsoup4==4.6.0
21 21
 caldav==0.4.0
22 22
 cliff==2.9.1
23 23
 cmd2==0.6.9
@@ -57,7 +57,7 @@ unicode-slugify==0.1.3
57 57
 vobject==0.9.2
58 58
 waitress==0.8.9
59 59
 who_ldap==3.2.2
60
--e git+https://github.com/algoo/wsgidav.git@py3#egg=wsgidav
60
+wsgidav==2.2.4
61 61
 zope.interface==4.1.3
62 62
 zope.sqlalchemy==0.7.6
63 63
 PyYAML

+ 0 - 3
tracim/setup.py 查看文件

@@ -86,8 +86,5 @@ setup(
86 86
             'mail sender = tracim.command.mail:MailSenderCommend',
87 87
         ]
88 88
     },
89
-    dependency_links=[
90
-        'http://github.com/algoo/preview-generator/tarball/master#egg=preview_generator-1.0',
91
-    ],
92 89
     zip_safe=False,
93 90
 )

+ 5 - 5
tracim/tracim/i18n/fr/LC_MESSAGES/tracim.po 查看文件

@@ -395,7 +395,7 @@ msgstr "Espace de travail {} restauré."
395 395
 #: tracim/lib/app_globals.py:26
396 396
 #, python-format
397 397
 msgid "%B %d at %I:%M%p"
398
-msgstr "le %d %B à %H:%M"
398
+msgstr "%d %B à %H:%M"
399 399
 
400 400
 #: tracim/lib/calendar.py:45
401 401
 msgid "My personal calendar"
@@ -1239,8 +1239,8 @@ msgid "shown"
1239 1239
 msgstr "affiché"
1240 1240
 
1241 1241
 #: tracim/templates/admin/user_getall.mak:20
1242
-msgid "manage users and associated workspaces"
1243
-msgstr "gestion des utilisateurs et espaces de travail associés"
1242
+msgid "Manage users and associated workspaces"
1243
+msgstr "Gestion des utilisateurs et espaces de travail associés"
1244 1244
 
1245 1245
 #: tracim/templates/admin/user_getall.mak:32
1246 1246
 msgid "Create a user account..."
@@ -1377,8 +1377,8 @@ msgid "Notifications"
1377 1377
 msgstr "Notifications"
1378 1378
 
1379 1379
 #: tracim/templates/admin/workspace_getall.mak:17
1380
-msgid "manage workspaces and subscribed users"
1381
-msgstr "gestion des espaces de travail et utilisateurs abonnés"
1380
+msgid "Manage workspaces and subscribed users"
1381
+msgstr "Gestion des espaces de travail et utilisateurs abonnés"
1382 1382
 
1383 1383
 #: tracim/templates/admin/workspace_getall.mak:27
1384 1384
 msgid "Create a workspace..."

+ 2 - 2
tracim/tracim/lib/daemons.py 查看文件

@@ -351,8 +351,8 @@ from tracim.lib.webdav.sql_domain_controller import TracimDomainController
351 351
 from inspect import isfunction
352 352
 import traceback
353 353
 
354
-from wsgidav.server.cherrypy import wsgiserver
355
-from wsgidav.server.cherrypy.wsgiserver.wsgiserver3 import CherryPyWSGIServer
354
+from cherrypy import wsgiserver
355
+from cherrypy.wsgiserver import CherryPyWSGIServer
356 356
 
357 357
 DEFAULT_CONFIG_FILE = "wsgidav.conf"
358 358
 PYTHON_VERSION = "%s.%s.%s" % (sys.version_info[0], sys.version_info[1], sys.version_info[2])

+ 4 - 3
tracim/tracim/lib/email.py 查看文件

@@ -4,6 +4,7 @@ import typing
4 4
 from email.message import Message
5 5
 from email.mime.multipart import MIMEMultipart
6 6
 from email.mime.text import MIMEText
7
+from email.utils import formataddr
7 8
 
8 9
 from mako.template import Template
9 10
 from tg.i18n import ugettext as _
@@ -156,11 +157,11 @@ class EmailManager(object):
156 157
             )
157 158
         message = MIMEMultipart('alternative')
158 159
         message['Subject'] = subject
159
-        message['From'] = '{0} <{1}>'.format(
160
+        message['From'] = formataddr((
160 161
             self._global_config.EMAIL_NOTIFICATION_FROM_DEFAULT_LABEL,
161 162
             self._global_config.EMAIL_NOTIFICATION_FROM_EMAIL,
162
-        )
163
-        message['To'] = user.email
163
+        ))
164
+        message['To'] = formataddr((user.get_display_name(), user.email))
164 165
 
165 166
         text_template_file_path = self._global_config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_TEXT  # nopep8
166 167
         html_template_file_path = self._global_config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_HTML  # nopep8

+ 2 - 6
tracim/tracim/lib/notifications.py 查看文件

@@ -208,10 +208,7 @@ class EmailNotifier(object):
208 208
         else:
209 209
             email_address = email_template.replace('{user_id}', '0')
210 210
 
211
-        return '{label} <{email_address}>'.format(
212
-            label = Header(mail_sender_name).encode(),
213
-            email_address = email_address
214
-        )
211
+        return formataddr((mail_sender_name, email_address))
215 212
 
216 213
     @staticmethod
217 214
     def log_notification(
@@ -270,7 +267,7 @@ class EmailNotifier(object):
270 267
 
271 268
         for role in notifiable_roles:
272 269
             logger.info(self, 'Sending email to {}'.format(role.user.email))
273
-            to_addr = '{name} <{email}>'.format(name=role.user.display_name, email=role.user.email)
270
+            to_addr = formataddr((role.user.display_name, role.user.email))
274 271
             #
275 272
             # INFO - G.M - 2017-11-15 - set content_id in header to permit reply
276 273
             # references can have multiple values, but only one in this case.
@@ -304,7 +301,6 @@ class EmailNotifier(object):
304 301
             # To link this email to a content we create a virtual parent
305 302
             # in reference who contain the content_id.
306 303
             message['References'] = formataddr(('',reference_addr))
307
-            # TODO: add correct header to allow reply
308 304
             body_text = self._build_email_body(self._global_config.EMAIL_NOTIFICATION_CONTENT_UPDATE_TEMPLATE_TEXT, role, content, user)
309 305
 
310 306
 

+ 6 - 4
tracim/tracim/lib/webdav/design.py 查看文件

@@ -173,9 +173,10 @@ def designPage(content: data.Content, content_revision: data.ContentRevisionRO)
173 173
                    )
174 174
     histHTML += '</table>'
175 175
 
176
-    file = '''
176
+    page = '''
177 177
 <html>
178 178
 <head>
179
+	<meta charset="utf-8" />
179 180
 	<title>%s</title>
180 181
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
181 182
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">
@@ -233,7 +234,7 @@ def designPage(content: data.Content, content_revision: data.ContentRevisionRO)
233 234
                content_revision.description,
234 235
                histHTML)
235 236
 
236
-    return file
237
+    return page
237 238
 
238 239
 def designThread(content: data.Content, content_revision: data.ContentRevisionRO, comments) -> str:
239 240
         hist = content.get_history()
@@ -291,9 +292,10 @@ def designThread(content: data.Content, content_revision: data.ContentRevisionRO
291 292
                                # t.ref_object.label) if t.type.id in ['revision', 'creation', 'edition'] else '')
292 293
                            )
293 294
 
294
-        page = '''
295
+        thread = '''
295 296
 <html>
296 297
 <head>
298
+	<meta charset="utf-8" />
297 299
 	<title>%s</title>
298 300
 	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
299 301
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
@@ -379,4 +381,4 @@ def designThread(content: data.Content, content_revision: data.ContentRevisionRO
379 381
                content_revision.description,
380 382
                disc)
381 383
 
382
-        return page
384
+        return thread

+ 56 - 0
tracim/tracim/public/assets/candy/candy/CONTRIBUTING.md 查看文件

@@ -0,0 +1,56 @@
1
+# Contributing
2
+
3
+## Team members
4
+
5
+* Patrick Stadler &middot; [@pstadler](http://twitter.com/pstadler) &middot; <patrick.stadler@gmail.com>
6
+* Michael Weibel &middot; [@weibelm](htps://twitter.com/weibelm) &middot; <michael.weibel@gmail.com>
7
+
8
+## Learn & listen
9
+
10
+[![Gitter chat](https://badges.gitter.im/candy-chat.png)](https://gitter.im/candy-chat)
11
+
12
+* [Mailing list](http://groups.google.com/group/candy-chat)
13
+	* yes, non-gmail users can signup as well
14
+* [FAQ](https://github.com/candy-chat/candy/wiki/Frequently-Asked-Questions)
15
+
16
+## Contributing
17
+
18
+You want to help us? **Awesome!**
19
+
20
+### How to contribute
21
+A few hopefully helpful hints to contributing to Candy
22
+
23
+#### Using vagrant
24
+1. [Fork](https://help.github.com/articles/fork-a-repo) Candy
25
+2. [Install Vagrant](http://vagrantup.com/)
26
+3. Run `vagrant up`.
27
+5. Create a branch based on the `master` branch (`git checkout -B my-awesome-feature`)
28
+6. Run `grunt watch` to automatically run jshint (syntax checker) and the build of `candy.bundle.js` and `candy.min.js` while developing.
29
+7. Make your changes, fix eventual *jshint* errors & push them back to your fork
30
+8. Create a [pull request](https://help.github.com/articles/using-pull-requests)
31
+
32
+
33
+#### On your own machine
34
+Please note that you should have a working XMPP server to test your changes (the vagrant way does already have a working XMPP server).
35
+
36
+1. [Fork](https://help.github.com/articles/fork-a-repo) Candy
37
+2. Clone your fork
38
+3. Checkout out `master` branch (`git checkout master`)
39
+4. Install [Node.js](http://nodejs.org/)
40
+5. Install [Grunt](http://gruntjs.com/) (`npm install -g grunt-cli`)
41
+6. Install [Bower](http://bower.io/) (`npm install -g bower`)
42
+7. Install npm dependencies (`npm install` in candy root directory)
43
+8. Install bower dependencies (`bower install` in candy root directory)
44
+9. Create a branch based on the `master` branch (`git checkout -B my-awesome-feature`)
45
+10. Run `grunt watch` to automatically run jshint (syntax checker) and the build of `candy.bundle.js` and `candy.min.js` while developing.
46
+11. Make your changes, fix eventual *jshint* errors & push them back to your fork
47
+12. Create a [pull request](https://help.github.com/articles/using-pull-requests)
48
+
49
+In case you have any questions, don't hesitate to ask on the [Mailing list](http://groups.google.com/group/candy-chat).
50
+
51
+### Running tests
52
+
53
+* Tests are run using [Intern](http://theintern.io).
54
+* `grunt` and `grunt watch` will each run unit tests in Chrome on Linux (for fast feedback).
55
+* `grunt test` will run both unit and integration tests in a variety of environments. Tests are run using Selenium Standalone and Phantom.JS while developing, and on Sauce Labs in CI or using `grunt test`.
56
+* If you don't want to use the Vagrant box to run Selenium/PhantomJS, set `CANDY_VAGRANT='false'` to run tests.

+ 9 - 0
tracim/tracim/public/assets/candy/candy/CREDITS.md 查看文件

@@ -0,0 +1,9 @@
1
+Credits
2
+=======
3
+- [Special thanks to our contributors](https://github.com/candy-chat/candy/graphs/contributors)
4
+- [famfamfam silk icons](http://www.famfamfam.com/lab/icons/silk/) is a smooth, free icon set, containing over 700 16-by-16 pixel icons.
5
+- [Simple Smileys](http://simplesmileys.org) are beautifully simple emoticons.
6
+- [Flash MP3 Player](http://flash-mp3-player.net/players/js) is a very simple flash audio player used by Candy for audio notifications.
7
+- [Colin Snover](http://zetafleet.com/blog/javascript-dateparse-for-iso-8601) provides a fix for browsers not supporting latest Date.parse().
8
+- [Ben Cherry](http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth) wrote a great article about the JS module pattern.
9
+- [Amiado Group](http://www.amiadogroup.com) allowed us to make Candy freely available for everyone :)

+ 9 - 0
tracim/tracim/public/assets/candy/candy/LICENSE 查看文件

@@ -0,0 +1,9 @@
1
+Copyright (c) 2011 Amiado Group AG
2
+Copyright (c) 2012-2014 Patrick Stadler & Michael Weibel
3
+Copyright (c) 2015 Adhearsion Foundation Inc <info@adhearsion.com>
4
+
5
+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:
6
+
7
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8
+
9
+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.

+ 28 - 0
tracim/tracim/public/assets/candy/candy/README.md 查看文件

@@ -0,0 +1,28 @@
1
+Candy — a JavaScript-based multi-user chat client
2
+==================================================
3
+
4
+[![Build Status](https://travis-ci.org/candy-chat/candy.png?branch=dev)](https://travis-ci.org/candy-chat/candy)
5
+[![Coverage Status](https://coveralls.io/repos/candy-chat/candy/badge.png?branch=dev)](https://coveralls.io/r/candy-chat/candy)
6
+
7
+Visit the official project page: http://candy-chat.github.io/candy
8
+
9
+Features
10
+--------
11
+- Focused on real-time multi-user chatting
12
+- Easy to configure, easy to run, easy to use
13
+- Highly customizable
14
+- 100% well-documented JavaScript source code
15
+- Built for Jabber (XMPP), using famous technologies
16
+- Used and approved in a productive environment with up to 400 concurrent users
17
+- Works with all major web browsers including IE9
18
+
19
+Plugins
20
+-------
21
+If you wish to add new functionality (to your candy installation) or contribute plugins, take a look at our [plugin repository](http://github.com/candy-chat/candy-plugins).
22
+
23
+Support & Community
24
+-------------------
25
+Take a look at our [FAQ](https://github.com/candy-chat/candy/wiki/Frequently-Asked-Questions). If it doesn't solve your questions, you're welcome to join our [Mailinglist on Google Groups](http://groups.google.com/group/candy-chat).
26
+You don't need to have a Gmail account for it.
27
+
28
+[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/a41a8075608abeaf99db685d7ef29cf6 "githalytics.com")](http://githalytics.com/candy-chat/candy)

+ 41 - 0
tracim/tracim/public/assets/candy/candy/bower.json 查看文件

@@ -0,0 +1,41 @@
1
+{
2
+  "name": "candy",
3
+  "version": "2.2.0",
4
+  "homepage": "http://candy-chat.github.io/candy/",
5
+  "authors": [
6
+    "Michael Weibel <michael.weibel@gmail.com>",
7
+    "Patrick Stadler <patrick.stadler@gmail.com>"
8
+  ],
9
+  "description": "Multi-user XMPP web client",
10
+  "main": [
11
+    "candy.min.js"
12
+  ],
13
+  "keywords": [
14
+    "xmpp",
15
+    "muc",
16
+    "multi-user",
17
+    "websocket",
18
+    "bosh",
19
+    "chat"
20
+  ],
21
+  "license": "MIT",
22
+  "repository": {
23
+    "type": "git",
24
+    "url": "git://github.com/candy-chat/candy.git"
25
+  },
26
+  "ignore": [
27
+    "**/.*",
28
+    "node_modules",
29
+    "bower_components",
30
+    "test",
31
+    "tests"
32
+  ],
33
+  "dependencies": {
34
+    "jquery": "~1.10.2",
35
+    "strophe": "1.1.3",
36
+    "strophejs-plugins": "benlangfeld/strophejs-plugins#30fb089457addc37e01d69c3536dee868a90a9ad",
37
+    "mustache": "0.3.0",
38
+    "jquery-i18n": "1.1.1",
39
+    "bootstrap": "~3.3.6"
40
+  }
41
+}

文件差异内容过多而无法显示
+ 6680 - 0
tracim/tracim/public/assets/candy/candy/candy.bundle.js


文件差异内容过多而无法显示
+ 1 - 0
tracim/tracim/public/assets/candy/candy/candy.bundle.map


文件差异内容过多而无法显示
+ 5 - 0
tracim/tracim/public/assets/candy/candy/candy.min.js


文件差异内容过多而无法显示
+ 1 - 0
tracim/tracim/public/assets/candy/candy/candy.min.map


+ 4 - 0
tracim/tracim/public/assets/candy/candy/example/htaccess 查看文件

@@ -0,0 +1,4 @@
1
+AddDefaultCharset UTF-8
2
+Options +MultiViews
3
+RewriteEngine On
4
+RewriteRule http-bind/ http://localhost:5280/http-bind/ [P]

+ 51 - 0
tracim/tracim/public/assets/candy/candy/example/index.html 查看文件

@@ -0,0 +1,51 @@
1
+<!DOCTYPE html>
2
+<html lang="en">
3
+<head>
4
+	<meta charset="utf-8">
5
+	<meta name="viewport" content="width=device-width, initial-scale=1">
6
+	<title>Candy - Chats are not dead yet</title>
7
+	<link rel="shortcut icon" href="../res/img/favicon.png" type="image/gif" />
8
+	<link rel="stylesheet" type="text/css" href="../libs.min.css" />
9
+	<link rel="stylesheet" type="text/css" href="../res/default.css" />
10
+
11
+	<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
12
+	<script type="text/javascript" src="../libs.min.js"></script>
13
+	<script type="text/javascript" src="../candy.min.js"></script>
14
+	<script type="text/javascript">
15
+		$(document).ready(function() {
16
+			Candy.init('http-bind/', {
17
+				core: {
18
+					// only set this to true if developing / debugging errors
19
+					debug: false,
20
+					// autojoin is a *required* parameter if you don't have a plugin (e.g. roomPanel) for it
21
+					//   true
22
+					//     -> fetch info from server (NOTE: does only work with openfire server)
23
+					//   ['test@conference.example.com']
24
+					//     -> array of rooms to join after connecting
25
+					autojoin: true
26
+				},
27
+				view: { assets: '../res/' }
28
+			});
29
+
30
+			Candy.Core.connect();
31
+
32
+			/**
33
+			 * Thanks for trying Candy!
34
+			 *
35
+			 * If you need more information, please see here:
36
+			 *   - Setup instructions & config params: http://candy-chat.github.io/candy/#setup
37
+			 *   - FAQ & more: https://github.com/candy-chat/candy/wiki
38
+			 *
39
+			 * Mailinglist for questions:
40
+			 *   - http://groups.google.com/group/candy-chat
41
+			 *
42
+			 * Github issues for bugs:
43
+			 *   - https://github.com/candy-chat/candy/issues
44
+			 */
45
+		});
46
+	</script>
47
+</head>
48
+<body>
49
+	<div id="candy"></div>
50
+</body>
51
+</html>

文件差异内容过多而无法显示
+ 6760 - 0
tracim/tracim/public/assets/candy/candy/libs.bundle.css


文件差异内容过多而无法显示
+ 6782 - 0
tracim/tracim/public/assets/candy/candy/libs.bundle.js


文件差异内容过多而无法显示
+ 1 - 0
tracim/tracim/public/assets/candy/candy/libs.bundle.map


文件差异内容过多而无法显示
+ 5 - 0
tracim/tracim/public/assets/candy/candy/libs.min.css


文件差异内容过多而无法显示
+ 3 - 0
tracim/tracim/public/assets/candy/candy/libs.min.js


+ 65 - 0
tracim/tracim/public/assets/candy/candy/package.json 查看文件

@@ -0,0 +1,65 @@
1
+{
2
+  "name": "candy",
3
+  "version": "2.2.0",
4
+  "description": "Multi-user XMPP web client",
5
+  "main": "candy.min.js",
6
+  "directories": {
7
+    "doc": "docs",
8
+    "example": "example"
9
+  },
10
+  "scripts": {
11
+    "test": "echo \"Error: no test specified\" && exit 1"
12
+  },
13
+  "repository": {
14
+    "type": "git",
15
+    "url": "git://github.com/candy-chat/candy.git"
16
+  },
17
+  "keywords": [
18
+    "xmpp",
19
+    "muc",
20
+    "multi-user",
21
+    "websocket",
22
+    "bosh",
23
+    "chat"
24
+  ],
25
+  "contributors": [
26
+    {
27
+      "name": "Michael Weibel",
28
+      "email": "michael.weibel@gmail.com"
29
+    },
30
+    {
31
+      "name": "Patrick Stadler",
32
+      "email": "patrick.stadler@gmail.com",
33
+      "url": "http://pstadler.sh"
34
+    }
35
+  ],
36
+  "license": "MIT",
37
+  "bugs": {
38
+    "url": "https://github.com/candy-chat/candy/issues"
39
+  },
40
+  "homepage": "http://candy-chat.github.io/candy/",
41
+  "devDependencies": {
42
+    "grunt": "^0.4.5",
43
+    "grunt-clear": "^0.2.1",
44
+    "grunt-contrib-clean": "^0.5.0",
45
+    "grunt-contrib-compress": "^0.13.0",
46
+    "grunt-contrib-concat": "^0.5.1",
47
+    "grunt-contrib-cssmin": "^0.14.0",
48
+    "grunt-contrib-jshint": "^0.10.0",
49
+    "grunt-contrib-uglify": "^0.4.0",
50
+    "grunt-contrib-watch": "^0.6.1",
51
+    "grunt-coveralls": "^0.3.0",
52
+    "grunt-github-releaser": "^0.1.17",
53
+    "grunt-mkdir": "^0.1.1",
54
+    "grunt-natural-docs": "^0.1.1",
55
+    "grunt-notify": "^0.3.0",
56
+    "grunt-prompt": "^1.3.0",
57
+    "grunt-sync-pkg": "^0.1.2",
58
+    "grunt-todo": "~0.4.0",
59
+    "intern": "^2.0.1",
60
+    "jshint-stylish": "^0.2.0",
61
+    "lolex": "^1.2.0",
62
+    "sinon": "^1.10.3",
63
+    "sinon-chai": "^2.5.0"
64
+  }
65
+}

+ 802 - 0
tracim/tracim/public/assets/candy/candy/res/default.css 查看文件

@@ -0,0 +1,802 @@
1
+/** File: default.css
2
+ * Candy - Chats are not dead yet.
3
+ *
4
+ * Legal: See the LICENSE file at the top-level directory of this distribution and at https://github.com/candy-chat/candy/blob/master/LICENSE
5
+ */
6
+html, body {
7
+	margin: 0;
8
+	padding: 0;
9
+	font-family: 'Helvetica Neue', Helvetica, sans-serif;
10
+}
11
+
12
+#candy {
13
+	top: 0;
14
+	bottom: 0;
15
+	right: 0;
16
+	left: 0;
17
+	background-color: #444;
18
+	color: #333;
19
+	overflow: hidden;
20
+}
21
+
22
+a {
23
+	color: #333;
24
+	text-decoration: none;
25
+}
26
+
27
+ul {
28
+	list-style: none;
29
+	padding: 0;
30
+	margin: 0;
31
+}
32
+
33
+#chat-tabs {
34
+	list-style: none;
35
+	margin: 0 200px 0 0;
36
+	padding: 0;
37
+	overflow: auto;
38
+	overflow-y: hidden;
39
+}
40
+
41
+#chat-tabs li {
42
+	margin: 0;
43
+	float: left;
44
+	position: relative;
45
+	white-space: nowrap;
46
+	margin: 3px 0 0 3px;
47
+}
48
+
49
+#chat-tabs a {
50
+	padding: 4px 50px 4px 10px;
51
+	display: inline-block;
52
+	color: #ccc;
53
+	height: 20px;
54
+	background-color: #666;
55
+	border-radius: 3px 3px 0 0;
56
+}
57
+
58
+#chat-tabs .active a {
59
+	background-color: #eee;
60
+	color: black;
61
+}
62
+
63
+#chat-tabs .transition {
64
+	position: absolute;
65
+	top: 0;
66
+	right: 0;
67
+	padding: 0;
68
+	width: 30px;
69
+	height: 30px;
70
+	background: url(img/tab-transitions.png) repeat-y left;
71
+	border-radius: 0 3px 0 0;
72
+}
73
+
74
+#chat-tabs a.close {
75
+	background-color: transparent;
76
+	position: absolute;
77
+	right: -2px;
78
+	top: -3px;
79
+	height: auto;
80
+	padding: 5px;
81
+	margin: 0 5px 0 2px;
82
+	color: #999;
83
+}
84
+
85
+#chat-tabs .active .transition {
86
+	background: url(img/tab-transitions.png) repeat-y -50px;
87
+}
88
+
89
+#chat-tabs .close:hover {
90
+	color: black;
91
+}
92
+
93
+#chat-tabs .unread {
94
+	color: white;
95
+	background-color: #9b1414;
96
+	padding: 2px 4px;
97
+	font-weight: bold;
98
+	font-size: 10px;
99
+	position: absolute;
100
+	top: 5px;
101
+	right: 22px;
102
+	border-radius: 3px;
103
+}
104
+
105
+#chat-tabs .offline .label {
106
+	text-decoration: line-through;
107
+}
108
+
109
+#chat-toolbar {
110
+	position: fixed;
111
+	bottom: 0;
112
+	right: 0;
113
+	font-size: 11px;
114
+	color: #666;
115
+	width: 200px;
116
+	height: 24px;
117
+	padding-top: 7px;
118
+	background-color: #444;
119
+	display: none;
120
+	border-top: 1px solid black;
121
+	box-shadow: 0 1px 0 0 #555 inset;
122
+}
123
+
124
+#chat-toolbar li {
125
+	width: 16px;
126
+	height: 16px;
127
+	margin-left: 5px;
128
+	float: left;
129
+	display: inline-block;
130
+	cursor: pointer;
131
+	background-position: top left;
132
+	background-repeat: no-repeat;
133
+}
134
+
135
+#chat-toolbar #emoticons-icon {
136
+	background-image: url(img/action/emoticons.png);
137
+}
138
+
139
+#chat-toolbar .context {
140
+	background-image: url(img/action/settings.png);
141
+	display: none;
142
+}
143
+
144
+.role-moderator #chat-toolbar .context, .affiliation-owner #chat-toolbar .context {
145
+	display: inline-block;
146
+}
147
+
148
+#chat-sound-control {
149
+	background-image: url(img/action/sound-off.png);
150
+}
151
+
152
+#chat-sound-control.checked {
153
+	background-image: url(img/action/sound-on.png);
154
+}
155
+
156
+#chat-autoscroll-control {
157
+	background-image: url(img/action/autoscroll-off.png);
158
+}
159
+
160
+#chat-autoscroll-control.checked {
161
+	background-image: url(img/action/autoscroll-on.png);
162
+}
163
+
164
+#chat-statusmessage-control {
165
+	background-image: url(img/action/statusmessage-off.png);
166
+}
167
+
168
+#chat-statusmessage-control.checked {
169
+	background-image: url(img/action/statusmessage-on.png);
170
+}
171
+
172
+#chat-toolbar .usercount {
173
+	background-image: url(img/action/usercount.png);
174
+	cursor: default;
175
+	padding-left: 20px;
176
+	width: auto;
177
+	margin-right: 5px;
178
+	float: right;
179
+}
180
+
181
+.usercount span {
182
+	display: inline-block;
183
+	padding: 1px 3px;
184
+	background-color: #666;
185
+	font-weight: bold;
186
+	border-radius: 3px;
187
+	color: #ccc;
188
+}
189
+
190
+.room-pane {
191
+	display: none;
192
+}
193
+
194
+.roster-pane {
195
+	position: absolute;
196
+	overflow: auto;
197
+	top: 0;
198
+	right: 0;
199
+	bottom: 0;
200
+	width: 200px;
201
+	margin: 30px 0 31px 0;
202
+	background-color: #333;
203
+	border-top: 1px solid black;
204
+	box-shadow: inset 0 1px 0 0 #555;
205
+}
206
+
207
+.roster-pane .user {
208
+	cursor: pointer;
209
+	padding: 7px 10px;
210
+	font-size: 12px;
211
+	opacity: 0;
212
+	display: none;
213
+	color: #ccc;
214
+	clear: both;
215
+	height: 14px;
216
+	border-bottom: 1px solid black;
217
+	box-shadow: 0 1px 0 0 #555;
218
+}
219
+
220
+.roster-pane .user:hover {
221
+	background-color: #222;
222
+}
223
+
224
+.roster-pane .user.status-ignored {
225
+	cursor: default;
226
+}
227
+
228
+.roster-pane .user.me {
229
+	font-weight: bold;
230
+	cursor: default;
231
+}
232
+
233
+.roster-pane .user.me:hover {
234
+	background-color: transparent;
235
+}
236
+
237
+.roster-pane .label {
238
+	float: left;
239
+	width: 110px;
240
+	overflow: hidden;
241
+	white-space: nowrap;
242
+	text-shadow: 1px 1px black;
243
+}
244
+
245
+.roster-pane li {
246
+	width: 16px;
247
+	height: 16px;
248
+	float: right;
249
+	display: block;
250
+	margin-left: 3px;
251
+	background-repeat: no-repeat;
252
+	background-position: center;
253
+}
254
+
255
+.roster-pane li.role {
256
+	cursor: default;
257
+	display: none;
258
+}
259
+
260
+.roster-pane li.role-moderator {
261
+	background-image: url(img/roster/role-moderator.png);
262
+	display: block;
263
+}
264
+
265
+.roster-pane li.affiliation-owner {
266
+	background-image: url(img/roster/affiliation-owner.png);
267
+	display: block;
268
+}
269
+
270
+.roster-pane li.ignore {
271
+	background-image: url(img/roster/ignore.png);
272
+	display: none;
273
+}
274
+
275
+.roster-pane .status-ignored li.ignore {
276
+	display: block;
277
+}
278
+
279
+.roster-pane li.context {
280
+	color: #999;
281
+	text-align: center;
282
+	cursor: pointer;
283
+}
284
+
285
+.roster-pane li.context:hover {
286
+	background-color: #666;
287
+	border-radius: 4px;
288
+}
289
+
290
+.roster-pane .me li.context {
291
+	display: none;
292
+}
293
+
294
+.message-pane-wrapper {
295
+	clear: both;
296
+	overflow: auto;
297
+	position: absolute;
298
+	top: 0;
299
+	right: 0;
300
+	bottom: 0;
301
+	left: 0;
302
+	height: auto;
303
+	width: auto;
304
+	margin: 30px 200px 31px 0;
305
+	background-color: #eee;
306
+	font-size: 13px;
307
+	padding: 0 5px;
308
+}
309
+
310
+.message-pane {
311
+	padding-top: 1px;
312
+}
313
+
314
+.message-pane li {
315
+	cursor: default;
316
+	border-bottom: 1px solid #ccc;
317
+	box-shadow: 0 1px 0 0 white;
318
+}
319
+
320
+.message-pane small {
321
+	display: none;
322
+	color: #a00;
323
+	font-size: 10px;
324
+	position: absolute;
325
+	background-color: #f7f7f7;
326
+	text-align: center;
327
+	line-height: 20px;
328
+	margin: 4px 0;
329
+	padding: 0 5px;
330
+	right: 5px;
331
+}
332
+
333
+.message-pane li:hover {
334
+	background-color: #f7f7f7;
335
+}
336
+
337
+.message-pane li:hover small {
338
+	display: block;
339
+}
340
+
341
+.message-pane li>div {
342
+	overflow: auto;
343
+	padding: 2px 0 2px 130px;
344
+	line-height: 24px;
345
+	white-space: -o-pre-wrap; /* Opera */
346
+	word-wrap: break-word; /* Internet Explorer 5.5+ */
347
+}
348
+
349
+.message-pane li>div p {
350
+	margin: 0;
351
+}
352
+
353
+.message-pane .label {
354
+	font-weight: bold;
355
+	white-space: nowrap;
356
+	display: block;
357
+	margin-left: -130px;
358
+	width: 110px;
359
+	float: left;
360
+	overflow: hidden;
361
+	text-align: right;
362
+	color: black;
363
+}
364
+
365
+.message-pane .label:hover,
366
+.message-pane .label:focus {
367
+	color: inherit;
368
+}
369
+
370
+.message-pane .spacer {
371
+	color: #aaa;
372
+	font-weight: bold;
373
+	margin-left: -14px;
374
+	float: left;
375
+}
376
+
377
+.message-pane .subject, .message-pane .subject .label {
378
+	color: #a00;
379
+	font-weight: bold;
380
+}
381
+
382
+.message-pane .adminmessage {
383
+	color: #a00;
384
+	font-weight: bold;
385
+}
386
+
387
+.message-pane .infomessage {
388
+	color: #888;
389
+	font-style: italic;
390
+}
391
+
392
+.message-pane div>a {
393
+	color: #a00;
394
+}
395
+
396
+.message-pane a:hover {
397
+	text-decoration: underline;
398
+}
399
+
400
+.message-pane .emoticon {
401
+	vertical-align: text-bottom;
402
+	height: 15px;
403
+	width: 15px;
404
+}
405
+
406
+.message-form-wrapper {
407
+	position: fixed;
408
+	bottom: 0;
409
+	left: 0;
410
+	right: 0;
411
+	width: auto;
412
+	margin-right: 200px;
413
+	border-top: 1px solid #ccc;
414
+	background-color: white;
415
+	height: 31px;
416
+}
417
+
418
+.message-form {
419
+	position: fixed;
420
+	bottom: 0;
421
+	left: 0;
422
+	right: 0;
423
+	margin-right: 320px;
424
+	padding: 0;
425
+}
426
+
427
+.message-form input {
428
+	border: 0 none;
429
+	padding: 5px 10px;
430
+	font-size: 14px;
431
+	width: 100%;
432
+	display: block;
433
+	outline-width: 0;
434
+	background-color: white;
435
+}
436
+
437
+.message-form input.submit {
438
+	cursor: pointer;
439
+	background-color: #ccc;
440
+	color: #666;
441
+	position: fixed;
442
+	bottom: 0;
443
+	right: 0;
444
+	margin: 3px 203px 3px 3px;
445
+	padding: 0 10px;
446
+	width: auto;
447
+	font-size: 12px;
448
+	line-height: 12px;
449
+	height: 25px;
450
+	font-weight: bold;
451
+	border-radius: 3px;
452
+}
453
+
454
+#tooltip {
455
+	position: absolute;
456
+	z-index: 10;
457
+	display: none;
458
+	margin: 13px -18px -3px -2px;
459
+	color: #333;
460
+	font-size: 11px;
461
+	padding: 5px 0;
462
+}
463
+
464
+#tooltip div {
465
+	background-color: #f7f7f7;
466
+	padding: 2px 5px;
467
+	zoom: 1;
468
+	box-shadow: 0 1px 2px rgba(0, 0, 0, .75);
469
+}
470
+
471
+.arrow {
472
+	background: url(img/tooltip-arrows.gif) no-repeat left bottom;
473
+	height: 5px;
474
+	display: block;
475
+	position: relative;
476
+	z-index: 11;
477
+}
478
+
479
+.right-bottom .arrow-bottom {
480
+	background-position: right bottom;
481
+}
482
+
483
+.arrow-top {
484
+	display: none;
485
+	background-position: left top;
486
+}
487
+
488
+.right-top .arrow-top {
489
+	display: block;
490
+	background-position: right top;
491
+}
492
+
493
+.left-top .arrow-top {
494
+	display: block;
495
+}
496
+
497
+
498
+.left-top .arrow-bottom,
499
+.right-top .arrow-bottom {
500
+	display: none;
501
+}
502
+
503
+#context-menu {
504
+	position: absolute;
505
+	z-index: 10;
506
+	display: none;
507
+	padding: 5px 10px;
508
+	margin: 13px -28px -3px -12px;
509
+}
510
+
511
+#context-menu ul {
512
+	background-color: #f7f7f7;
513
+	color: #333;
514
+	font-size: 12px;
515
+	padding: 2px;
516
+	zoom: 1;
517
+	box-shadow: 0 1px 2px rgba(0, 0, 0, .75);
518
+}
519
+
520
+#context-menu li {
521
+	padding: 3px 5px 3px 20px;
522
+	line-height: 12px;
523
+	cursor: pointer;
524
+	margin-bottom: 2px;
525
+	background: 1px no-repeat;
526
+	white-space: nowrap;
527
+}
528
+
529
+#context-menu li:hover {
530
+	background-color: #ccc;
531
+}
532
+
533
+#context-menu li:last-child {
534
+	margin-bottom: 0;
535
+}
536
+
537
+#context-menu .private {
538
+	background-image: url(img/action/private.png);
539
+}
540
+
541
+#context-menu .ignore {
542
+	background-image: url(img/action/ignore.png);
543
+}
544
+
545
+#context-menu .unignore {
546
+	background-image: url(img/action/unignore.png);
547
+}
548
+
549
+#context-menu .kick {
550
+	background-image: url(img/action/kick.png);
551
+}
552
+
553
+#context-menu .ban {
554
+	background-image: url(img/action/ban.png);
555
+}
556
+
557
+#context-menu .subject {
558
+	background-image: url(img/action/subject.png);
559
+}
560
+
561
+#context-menu .emoticons {
562
+	padding-left: 5px;
563
+	width: 85px;
564
+	white-space: normal;
565
+}
566
+
567
+#context-menu .emoticons:hover {
568
+	background-color: transparent;
569
+}
570
+
571
+#context-menu .emoticons img {
572
+	cursor: pointer;
573
+	margin: 3px;
574
+	height: 15px;
575
+	width: 15px;
576
+}
577
+
578
+#chat-modal.modal-common {
579
+	background: #eee;
580
+	width: 300px;
581
+	padding: 20px 5px;
582
+	color: #333;
583
+	font-size: 16px;
584
+	position: fixed;
585
+	left: 50%;
586
+	top: 50%;
587
+	margin-left: -160px;
588
+	margin-top: -45px;
589
+	text-align: center;
590
+	display: none;
591
+	z-index: 100;
592
+	border: 5px solid #888;
593
+	border-radius: 5px;
594
+	box-shadow: 0 0 5px black;
595
+}
596
+
597
+#chat-modal-overlay {
598
+	position: absolute;
599
+	left: 0;
600
+	top: 0;
601
+	right: 0;
602
+	bottom: 0;
603
+	z-index: 90;
604
+	background-image: url(img/overlay.png);
605
+}
606
+
607
+#chat-modal.modal-login {
608
+	display: block;
609
+	margin-top: -100px;
610
+}
611
+
612
+#chat-modal-spinner {
613
+	display: none;
614
+	margin-left: 15px;
615
+}
616
+
617
+#chat-modal form {
618
+	margin: 15px 0;
619
+}
620
+
621
+#chat-modal label, #chat-modal input, #chat-modal select {
622
+	display: block;
623
+	float: left;
624
+	line-height: 26px;
625
+	font-size: 16px;
626
+	margin: 5px 0;
627
+}
628
+
629
+#chat-modal input, #chat-modal select {
630
+	padding: 2px;
631
+	line-height: 16px;
632
+	width: 150px;
633
+}
634
+
635
+#chat-modal input[type='text'],
636
+#chat-modal input[type='password'] {
637
+	background-color: white;
638
+	border: 1px solid #ccc;
639
+	padding: 4px;
640
+	font-size: 14px;
641
+	color: #333;
642
+}
643
+
644
+#chat-modal.login-with-domains {
645
+	width: 650px;
646
+	margin-left: -330px;
647
+}
648
+
649
+#chat-modal span.at-symbol {
650
+	float: left;
651
+	padding: 6px;
652
+	font-size: 14px;
653
+}
654
+
655
+#chat-modal select[name=domain] {
656
+	width: 320px;
657
+}
658
+
659
+#chat-modal label {
660
+	 text-align: right;
661
+	 padding-right: 1em;
662
+	 clear: both;
663
+	 width: 100px;
664
+}
665
+
666
+#chat-modal input.button {
667
+	float: none;
668
+	display: block;
669
+	margin: 5px auto;
670
+	clear: both;
671
+	position: relative;
672
+	top: 10px;
673
+	width: 200px;
674
+}
675
+
676
+#chat-modal .close {
677
+	position: absolute;
678
+	right: 0;
679
+	display: none;
680
+	padding: 0 5px;
681
+	margin: -17px 3px 0 0;
682
+	color: #999;
683
+	border-radius: 3px;
684
+}
685
+
686
+#chat-modal .close:hover {
687
+	color: #333;
688
+	background-color: #aaa;
689
+}
690
+
691
+/**
692
+ * Bootstrap Responsive Design styles
693
+ * It add styles to every element so we need to override some to keep the look of Candy
694
+ */
695
+*, :after, :before {
696
+	-webkit-box-sizing: content-box;
697
+	-moz-box-sizing: content-box;
698
+	box-sizing: content-box;
699
+}
700
+
701
+label {
702
+	font-weight: normal;
703
+}
704
+
705
+.label {
706
+	font-size: 100%;
707
+	font-weight: normal;
708
+	text-align: left;
709
+	line-height: inherit;
710
+	padding: 0;
711
+	color: inherit;
712
+}
713
+
714
+.close {
715
+	font-size: inherit;
716
+	line-height: inherit;
717
+	opacity: 1;
718
+	text-shadow: none;
719
+}
720
+
721
+#mobile-roster-icon {
722
+	display: none;
723
+}
724
+
725
+/*
726
+ * Responsive specific styles for devices under 600px
727
+ * Mainly changing the size of room, roster and message panes when opened / closed
728
+ */
729
+@media (max-width: 599px) {
730
+	.room-pane .message-pane-wrapper {
731
+		margin-right: 50px;
732
+	}
733
+
734
+	.room-pane:not(.open) .roster-pane {
735
+		right: -150px;
736
+	}
737
+
738
+	.roster-pane {
739
+		z-index: 10;
740
+	}
741
+
742
+	.message-pane li>div {
743
+		padding-left: 10px;
744
+	}
745
+
746
+	.message-pane li>div.infomessage {
747
+		padding-left: 30px;
748
+	}
749
+
750
+	.message-pane .label {
751
+		width: auto;
752
+		margin-left: 0;
753
+	}
754
+
755
+	.message-pane .spacer {
756
+		margin: 0 5px;
757
+	}
758
+
759
+	.room-pane:not(.open) .message-form-wrapper {
760
+		margin-right: 50px;
761
+	}
762
+
763
+	.room-pane:not(.open) .message-form {
764
+		margin-right: 150px;
765
+	}
766
+
767
+	.room-pane:not(.open) .message-form input.submit {
768
+		margin-right: 53px;
769
+	}
770
+
771
+	#mobile-roster-icon {
772
+		position: fixed;
773
+		top: 0;
774
+		right: 0;
775
+	}
776
+
777
+/*
778
+ * These are for the hamburger icon. The box-shadow adds the extra lines
779
+ */
780
+	.box-shadow-icon {
781
+		position: relative;
782
+		display: block;
783
+		width: 50px;
784
+		height: 30px;
785
+		cursor: pointer;
786
+	}
787
+
788
+	.box-shadow-icon:before {
789
+		content: "";
790
+		position: absolute;
791
+		left: 15px;
792
+		top: 9px;
793
+		width: 20px;
794
+		height: 2px;
795
+		background: #aaa;
796
+		box-shadow: 0 5px 0 0 #aaa, 0 10px 0 0 #aaa;
797
+	}
798
+
799
+	.box-shadow-icon:hover {
800
+		background: #222;
801
+	}
802
+}

二进制
tracim/tracim/public/assets/candy/candy/res/img/action/autoscroll-off.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/autoscroll-on.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/ban.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/emoticons.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/ignore.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/kick.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/menu.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/private.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/settings.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/sound-off.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/sound-on.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/statusmessage-off.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/statusmessage-on.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/subject.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/unignore.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/action/usercount.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Angel.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Angry.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Aww.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Aww_2.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Blushing.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Childish.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Confused.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Creepy.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Crying.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Cthulhu.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Cute.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Cute_Winking.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Devil.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Gah.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Gah_2.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Gasping.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Greedy.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Grinning.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Grinning_Winking.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Happy.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Happy_2.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Happy_3.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Heart.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Huh.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Huh_2.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Laughing.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Lips_Sealed.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Madness.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Malicious.png 查看文件


+ 2 - 0
tracim/tracim/public/assets/candy/candy/res/img/emoticons/README 查看文件

@@ -0,0 +1,2 @@
1
+Simple Smileys is a set of 49 clean, free as in freedom, Public Domain smileys.
2
+For more packages or older versions, visit http://simplesmileys.org

二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Sick.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Smiling.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Speechless.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Spiteful.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Stupid.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Sunglasses.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Terrified.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Thumb_Down.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Thumb_Up.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tired.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Laughing.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Left.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Up.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Up_Left.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Tongue_Out_Winking.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Uncertain.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Uncertain_2.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Unhappy.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/emoticons/Winking.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/favicon.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/modal-spinner.gif 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/overlay.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/roster/affiliation-owner.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/roster/ignore.png 查看文件


二进制
tracim/tracim/public/assets/candy/candy/res/img/roster/role-moderator.png 查看文件


+ 0 - 0
tracim/tracim/public/assets/candy/candy/res/img/tab-transitions.png 查看文件


部分文件因为文件数量过多而无法显示