浏览代码

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
 
102
 
103
 In case you prefer using Docker:
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
                -p 80:80 -p 3030:3030 -p 5232:5232 \
106
                -p 80:80 -p 3030:3030 -p 5232:5232 \
107
                -v /var/tracim/etc:/etc/tracim -v /var/tracim/var:/var/tracim algoo/tracim
107
                -v /var/tracim/etc:/etc/tracim -v /var/tracim/var:/var/tracim algoo/tracim
108
 
108
 
118
 
118
 
119
 You'll need to install the following packages :
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
                      python3 python-virtualenv python3-dev python-pip  python-lxml \
122
                      python3 python-virtualenv python3-dev python-pip  python-lxml \
123
                      build-essential libxml2-dev libxslt1-dev zlib1g-dev libjpeg-dev \
123
                      build-essential libxml2-dev libxslt1-dev zlib1g-dev libjpeg-dev \
124
                      libmagickwand-6.q16-3
124
                      libmagickwand-6.q16-3

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

57
 In this case, delete the user and database and start over:
57
 In this case, delete the user and database and start over:
58
 
58
 
59
     sudo --user=postgres psql \
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
 [//]: # (The following lines are only necessary to fix permissions on an existing database:)
63
 [//]: # (The following lines are only necessary to fix permissions on an existing database:)
64
 [//]: # (    sudo --user=postgres psql \)
64
 [//]: # (    sudo --user=postgres psql \)
88
 
88
 
89
 Create a database with following command:
89
 Create a database with following command:
90
 
90
 
91
-    CREATE DATABASE tracimdb;
91
+    CREATE DATABASE tracimdb CHARACTER SET = utf8;
92
 
92
 
93
 Create a user with following command:
93
 Create a user with following command:
94
 
94
 

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

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

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

86
             'mail sender = tracim.command.mail:MailSenderCommend',
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
     zip_safe=False,
89
     zip_safe=False,
93
 )
90
 )

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

395
 #: tracim/lib/app_globals.py:26
395
 #: tracim/lib/app_globals.py:26
396
 #, python-format
396
 #, python-format
397
 msgid "%B %d at %I:%M%p"
397
 msgid "%B %d at %I:%M%p"
398
-msgstr "le %d %B à %H:%M"
398
+msgstr "%d %B à %H:%M"
399
 
399
 
400
 #: tracim/lib/calendar.py:45
400
 #: tracim/lib/calendar.py:45
401
 msgid "My personal calendar"
401
 msgid "My personal calendar"
1239
 msgstr "affiché"
1239
 msgstr "affiché"
1240
 
1240
 
1241
 #: tracim/templates/admin/user_getall.mak:20
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
 #: tracim/templates/admin/user_getall.mak:32
1245
 #: tracim/templates/admin/user_getall.mak:32
1246
 msgid "Create a user account..."
1246
 msgid "Create a user account..."
1377
 msgstr "Notifications"
1377
 msgstr "Notifications"
1378
 
1378
 
1379
 #: tracim/templates/admin/workspace_getall.mak:17
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
 #: tracim/templates/admin/workspace_getall.mak:27
1383
 #: tracim/templates/admin/workspace_getall.mak:27
1384
 msgid "Create a workspace..."
1384
 msgid "Create a workspace..."

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

351
 from inspect import isfunction
351
 from inspect import isfunction
352
 import traceback
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
 DEFAULT_CONFIG_FILE = "wsgidav.conf"
357
 DEFAULT_CONFIG_FILE = "wsgidav.conf"
358
 PYTHON_VERSION = "%s.%s.%s" % (sys.version_info[0], sys.version_info[1], sys.version_info[2])
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
 from email.message import Message
4
 from email.message import Message
5
 from email.mime.multipart import MIMEMultipart
5
 from email.mime.multipart import MIMEMultipart
6
 from email.mime.text import MIMEText
6
 from email.mime.text import MIMEText
7
+from email.utils import formataddr
7
 
8
 
8
 from mako.template import Template
9
 from mako.template import Template
9
 from tg.i18n import ugettext as _
10
 from tg.i18n import ugettext as _
156
             )
157
             )
157
         message = MIMEMultipart('alternative')
158
         message = MIMEMultipart('alternative')
158
         message['Subject'] = subject
159
         message['Subject'] = subject
159
-        message['From'] = '{0} <{1}>'.format(
160
+        message['From'] = formataddr((
160
             self._global_config.EMAIL_NOTIFICATION_FROM_DEFAULT_LABEL,
161
             self._global_config.EMAIL_NOTIFICATION_FROM_DEFAULT_LABEL,
161
             self._global_config.EMAIL_NOTIFICATION_FROM_EMAIL,
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
         text_template_file_path = self._global_config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_TEXT  # nopep8
166
         text_template_file_path = self._global_config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_TEXT  # nopep8
166
         html_template_file_path = self._global_config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_HTML  # nopep8
167
         html_template_file_path = self._global_config.EMAIL_NOTIFICATION_CREATED_ACCOUNT_TEMPLATE_HTML  # nopep8

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

208
         else:
208
         else:
209
             email_address = email_template.replace('{user_id}', '0')
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
     @staticmethod
213
     @staticmethod
217
     def log_notification(
214
     def log_notification(
270
 
267
 
271
         for role in notifiable_roles:
268
         for role in notifiable_roles:
272
             logger.info(self, 'Sending email to {}'.format(role.user.email))
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
             # INFO - G.M - 2017-11-15 - set content_id in header to permit reply
272
             # INFO - G.M - 2017-11-15 - set content_id in header to permit reply
276
             # references can have multiple values, but only one in this case.
273
             # references can have multiple values, but only one in this case.
304
             # To link this email to a content we create a virtual parent
301
             # To link this email to a content we create a virtual parent
305
             # in reference who contain the content_id.
302
             # in reference who contain the content_id.
306
             message['References'] = formataddr(('',reference_addr))
303
             message['References'] = formataddr(('',reference_addr))
307
-            # TODO: add correct header to allow reply
308
             body_text = self._build_email_body(self._global_config.EMAIL_NOTIFICATION_CONTENT_UPDATE_TEMPLATE_TEXT, role, content, user)
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
                    )
173
                    )
174
     histHTML += '</table>'
174
     histHTML += '</table>'
175
 
175
 
176
-    file = '''
176
+    page = '''
177
 <html>
177
 <html>
178
 <head>
178
 <head>
179
+	<meta charset="utf-8" />
179
 	<title>%s</title>
180
 	<title>%s</title>
180
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
181
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
181
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">
182
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">
233
                content_revision.description,
234
                content_revision.description,
234
                histHTML)
235
                histHTML)
235
 
236
 
236
-    return file
237
+    return page
237
 
238
 
238
 def designThread(content: data.Content, content_revision: data.ContentRevisionRO, comments) -> str:
239
 def designThread(content: data.Content, content_revision: data.ContentRevisionRO, comments) -> str:
239
         hist = content.get_history()
240
         hist = content.get_history()
291
                                # t.ref_object.label) if t.type.id in ['revision', 'creation', 'edition'] else '')
292
                                # t.ref_object.label) if t.type.id in ['revision', 'creation', 'edition'] else '')
292
                            )
293
                            )
293
 
294
 
294
-        page = '''
295
+        thread = '''
295
 <html>
296
 <html>
296
 <head>
297
 <head>
298
+	<meta charset="utf-8" />
297
 	<title>%s</title>
299
 	<title>%s</title>
298
 	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
300
 	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
299
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
301
 	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
379
                content_revision.description,
381
                content_revision.description,
380
                disc)
382
                disc)
381
 
383
 
382
-        return page
384
+        return thread

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

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件

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 查看文件


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