...
 
Commits (4)
......@@ -41,17 +41,15 @@ SERVERROOTFILES = $(addprefix $(DESTDIR)/,server/.htaccess server/manifest.dtd)
# Client files
CSS = $(wildcard client/resources/css/*/*.css client/extjs/ux/css/ux-all.css client/extjs/resources/css/*.css)
CSS = $(wildcard client/resources/css/*.* client/resources/css/*/*.* client/extjs/ux/css/ux-all.css client/extjs/resources/css/*.css)
CSSDEST = $(addprefix $(DESTDIR)/, $(CSS))
IMAGEDIR = client/resources/images
IMAGES = $(wildcard $(IMAGEDIR)/*.* $(IMAGEDIR)/whatsnew/*.*)
IMAGESDEST = $(addprefix $(DESTDIR)/, $(IMAGES))
APPICONS = $(wildcard $(IMAGEDIR)/app-icons/*.*)
APPICONSDEST = $(addprefix $(DESTDIR)/, $(APPICONS))
APPICONSSCSS = client/resources/scss/base/_icons.scss
APPICONSEXTENSIONSFILE = client/resources/images/app-icons.extensions.json
IMAGES = $(filter-out $(APPICONSEXTENSIONSFILE), $(wildcard $(IMAGEDIR)/*.* $(IMAGEDIR)/whatsnew/*.*))
IMAGESDEST = $(addprefix $(DESTDIR)/, $(IMAGES))
EXTJSMODFILES = $(wildcard client/extjs-mod/*.js)
KOPANOCSS = $(DESTDIR)/client/resources/css/kopano.css
ICONEXTENSIONSFILE = client/resources/iconsets/extensions.json
ICONSETS = $(notdir $(filter-out client/resources/iconsets/extensions.json, $(wildcard client/resources/iconsets/*)))
ICONS = $(foreach iconsetdir,$(ICONSETS),$(wildcard client/resources/iconsets/$(iconsetdir)/src/png/*/*.png))
......@@ -77,14 +75,11 @@ test: jstest
server: $(MOS) $(LANGTXTDEST) $(PHPFILES) $(DESTDIR)/$(APACHECONF) $(DISTFILES) $(ROBOTS) $(HTACCESS) $(DESTDIR)/version $(SERVERROOTFILES)
client: $(CSSDEST) $(ICONSETSDEST) $(IMAGESDEST) $(KOPANOCSS) $(APPICONSDEST) js
client: $(CSSDEST) $(ICONSETSDEST) $(IMAGESDEST) js
cp -r client/resources/fonts $(DESTDIR)/client/resources/
cp -r client/resources/scss $(DESTDIR)/client/resources/
cp -r client/resources/config.rb $(DESTDIR)/client/resources/
cp -r client/resources/iconsets $(DESTDIR)/client/resources/
cp -r client/zarafa/core/themes $(DESTDIR)/client/
cp -r client/resources/images/app-icons $(DESTDIR)/client/resources/images/
rm -rf $(DESTDIR)/client/themes/*/js
cp -r client/resources/scss $(DESTDIR)/client/resources/scss
# TODO use separate targets
js: $(JSDEPLOY)/fingerprint.js $(JSDEPLOY)/resize.js $(TEMPATEJSDEST) $(JSDEPLOY)/kopano.js $(JSDEPLOY)/extjs-mod/extjs-mod.js $(JSDEPLOY)/extjs/ext-base-all.js $(DESTDIR)/client/third-party/ux-thirdparty.js
......@@ -112,10 +107,6 @@ $(ROBOTS): robots.txt
$(HTACCESS): .htaccess
cp $< $@
$(KOPANOCSS): client/resources/css/design.css
mkdir -p $$(dirname $@)
cp $< $@
$(DESTDIR)/%.mo : %.po
mkdir -p $$(dirname $@)
$(MSGFMT) -v -o $@ $<
......
......@@ -66,7 +66,7 @@
<!-- The Kopano CSS files -->
<property name="kopano-css-folder" value="resources/css"/>
<property name="kopano-css-file" value="kopano.css"/>
<property name="kopano-scss-folder" value="resources/scss"/>
<!-- The Kopano images -->
<property name="kopano-images-folder" value="resources/images"/>
......@@ -218,27 +218,6 @@
<fileset dir="zarafa" includes="**/*.js" />
</concatfiles>
</zConcat>
<!-- Compile SASS files -->
<!-- FIXME: throw error when compass is not found
<echo message="Compiling: ${kopano-css-folder}"/>
<exec executable="compass" failonerror="true" logError="true">
<arg value="compile" />
<arg value="-\-boring" />
<arg value="-c" />
<arg value="${kopano-css-folder}/../config.rb" />
<arg value="${kopano-css-folder}/../"/>
</exec>
-->
<!-- Concatenate zarafa CSS files -->
<mkdir dir="${target-folder}/${kopano-css-folder}"/>
<echo message="Concatenating: ${kopano-css-file}"/>
<zConcat outputFolder="${target-folder}/${kopano-css-folder}" outputFile="${kopano-css-file}">
<concatfiles>
<fileset dir="${kopano-css-folder}" includes="**/*.css" excludes="external/**/*.css" />
</concatfiles>
</zConcat>
</target>
<!-- Compress JavaScript -->
......@@ -328,7 +307,7 @@
<!-- copy files -->
<copy todir="${target-folder}">
<fileset dir=".">
<include name="resources/**/*.*"/>
<include name="resources/fonts/"/>
<include name="third-party/resources/**/*.*"/>
<!-- Don't copy the entire extjs resources folder,
we want to loose all individual CSS files -->
......@@ -341,26 +320,31 @@
<!-- exclude the ant script -->
<exclude name="build.xml"/>
<!-- CSS is generated during build -->
<exclude name="resources/css/*.*"/>
<exclude name="third-party/resources/css/*.*"/>
<exclude name="resources/.sass-cache/**/*"/>
</fileset>
</copy>
<!-- copy files -->
<copy todir="${target-folder}">
<fileset dir=".">
<include name="resources/css/external/*.css" />
<include name="resources/images/*" />
<!-- copy css files (including sourcemaps) -->
<copy todir="${target-folder}/${kopano-css-folder}">
<fileset dir="${kopano-css-folder}">
<include name="**/*" />
</fileset>
</copy>
<!-- copy scss files (used by the sourcemaps) -->
<copy todir="${target-folder}/${kopano-scss-folder}">
<fileset dir="${kopano-scss-folder}">
<include name="**/*" />
</fileset>
</copy>
<!-- Copy the images of the new design to the images folder -->
<!-- Copy the images -->
<echo message="Copying ${kopano-images-folder}"/>
<copy todir="${target-folder}/${kopano-images-folder}">
<copy todir="${target-folder}/${kopano-images-folder}" includeEmptyDirs="false">
<fileset dir="${kopano-images-folder}">
<include name="*.png"/>
<include name="*.gif"/>
<include name="**/*"/>
<exclude name="app-icons/"/>
<exclude name="app-icons.extensions.json"/>
</fileset>
</copy>
......@@ -377,6 +361,7 @@
<copy todir="${target-folder}/${kopano-iconsets-target-folder}" includeEmptyDirs="false">
<fileset dir="${kopano-iconsets-folder}">
<exclude name="extensions.json"/>
<exclude name="breeze/extensions-breeze.json"/>
<exclude name="**/src/**/*"/>
</fileset>
</copy>
......
......@@ -14,7 +14,11 @@ javascripts_dir = "javascripts"
# You can select your preferred output style here (can be overridden via the command line):
# output_style = :expanded or :nested or :compact or :compressed
# output_style = :compressed
output_style = :compressed
# Create inline sourcemaps
sourcemap = true
sass_options = {:sourcemap => :auto}
# To enable relative paths to assets via compass helper functions. Uncomment:
relative_assets = true
......
This diff is collapsed.
This diff is collapsed.
{
"version": 3,
"mappings": "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",
"sources": ["../../scss/external/login.scss","../../scss/base/_colors.scss"],
"names": [],
"file": "login.css"
}
\ No newline at end of file
/* setting the margin to 0 makes some browsers use the full paper, and disabling their header and footers */
@page {
size: auto;
/* auto is the initial value */
margin-top: 0.5in;
margin-bottom: 0.5in;
margin-left: 0.5in;
margin-right: 0.5in;
}
@media print {
/* line 12, ../../scss/external/_print.scss */
thead {
display: table-header-group;
}
/* line 16, ../../scss/external/_print.scss */
#pagemargin {
min-height: 100%;
margin: 0;
}
}
/* common css to make some tags clear on paper */
/* line 23, ../../scss/external/_print.scss */
html, div, dl, dt, dd, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, p, blockquote, th, td {
margin: 0;
padding: 0;
}
/* line 27, ../../scss/external/_print.scss */
img, body, html {
border: 0;
}
/* line 30, ../../scss/external/_print.scss */
address, caption, cite, code, dfn, th, var {
font-style: normal;
font-weight: normal;
}
/* line 34, ../../scss/external/_print.scss */
caption, th {
text-align: left;
}
/* line 37, ../../scss/external/_print.scss */
h1, h2, h3, h4, h5, h6 {
font-size: 100%;
}
/* line 40, ../../scss/external/_print.scss */
q:before, q:after {
content: '';
}
/* common util classes */
/* line 45, ../../scss/external/_print.scss */
.nowrap {
white-space: nowrap;
}
/* line 48, ../../scss/external/_print.scss */
.wrap {
white-space: normal;
}
/* line 51, ../../scss/external/_print.scss */
.fullwidth {
width: 100%;
}
/* line 3, ../../scss/external/print.calendar.scss */
table {
width: 100%;
text-align: left;
font-size: 11px;
font-family: arial;
border-collapse: collapse;
}
/* line 11, ../../scss/external/print.calendar.scss */
table th {
font-weight: bold;
padding: 2px 3px 2px 0px;
}
/* line 16, ../../scss/external/print.calendar.scss */
table td {
padding: 2px 3px 2px 0px;
}
/* date picker css */
/* line 21, ../../scss/external/print.calendar.scss */
.x-date-prevday a {
color: transparent;
}
/* line 24, ../../scss/external/print.calendar.scss */
.x-date-nextday a {
color: transparent;
}
/* line 27, ../../scss/external/print.calendar.scss */
.x-date-active a {
color: black;
text-decoration: none;
}
/* line 31, ../../scss/external/print.calendar.scss */
.x-date-active {
text-align: right;
}
/* line 34, ../../scss/external/print.calendar.scss */
.x-date-left {
display: none;
}
/* line 37, ../../scss/external/print.calendar.scss */
.x-date-right {
display: none;
}
/* line 40, ../../scss/external/print.calendar.scss */
.x-btn button {
background: none repeat scroll 0 0 transparent;
border: 0 none;
}
/* line 45, ../../scss/external/print.calendar.scss */
th.date-header {
text-align: right;
background-color: lightgrey;
width: 50%;
}
/* line 50, ../../scss/external/print.calendar.scss */
th.date-header-center {
text-align: center;
background-color: lightgrey;
}
/* line 55, ../../scss/external/print.calendar.scss */
table.print-calendar {
border: 1px solid black;
border-collapse: collapse;
height: 95%;
}
/* line 60, ../../scss/external/print.calendar.scss */
.print-calendar th {
border: 1px solid black;
}
/* line 64, ../../scss/external/print.calendar.scss */
#top th {
border: none;
}
/* line 67, ../../scss/external/print.calendar.scss */
table.inner {
border: none;
}
/* line 71, ../../scss/external/print.calendar.scss */
.calendar-allday td {
text-align: center;
border: 1px solid black;
}
/* line 75, ../../scss/external/print.calendar.scss */
.calendar-normal td {
text-align: left;
}
/* line 78, ../../scss/external/print.calendar.scss */
td.calendar-item {
width: 100%;
}
/* line 82, ../../scss/external/print.calendar.scss */
.k-calendar-header {
border: 1px solid black;
}
/* line 86, ../../scss/external/print.calendar.scss */
table.k-calendar-days {
margin-top: 5px;
}
/* line 89, ../../scss/external/print.calendar.scss */
table.k-calendar-days th {
border: 1px solid black;
text-align: center;
background-color: lightgrey;
width: 14.28% !important;
}
/* line 96, ../../scss/external/print.calendar.scss */
table.k-calendar-days td {
border: 1px solid #000;
vertical-align: top;
text-align: left;
}
/* line 101, ../../scss/external/print.calendar.scss */
table.k-calendar-days td svg.k-appointment-status {
position: absolute;
display: inline-block;
width: 7px;
top: 0;
left: 0;
bottom: 0;
}
/* line 110, ../../scss/external/print.calendar.scss */
table.k-calendar-days td .k-appointment {
font-size: 14px;
width: 90%;
height: 20px;
border-radius: 4px;
line-height: 1.5;
background-color: #FFF;
position: absolute;
left: 2.5%;
margin-bottom: 1px;
}
/* line 122, ../../scss/external/print.calendar.scss */
table.k-calendar-days td .k-overflow-indicator {
display: inline-block;
position: absolute;
bottom: 0px;
right: 0px;
height: 10px;
}
@page{size:auto;margin-top:0.5in;margin-bottom:0.5in;margin-left:0.5in;margin-right:0.5in}@media print{thead{display:table-header-group}#pagemargin{min-height:100%;margin:0}}html,div,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0}img,body,html{border:0}address,caption,cite,code,dfn,th,var{font-style:normal;font-weight:normal}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:''}.nowrap{white-space:nowrap}.wrap{white-space:normal}.fullwidth{width:100%}table{width:100%;text-align:left;font-size:11px;font-family:arial;border-collapse:collapse}table th{font-weight:bold;padding:2px 3px 2px 0px}table td{padding:2px 3px 2px 0px}.x-date-prevday a{color:transparent}.x-date-nextday a{color:transparent}.x-date-active a{color:black;text-decoration:none}.x-date-active{text-align:right}.x-date-left{display:none}.x-date-right{display:none}.x-btn button{background:none repeat scroll 0 0 transparent;border:0 none}th.date-header{text-align:right;background-color:lightgrey;width:50%}th.date-header-center{text-align:center;background-color:lightgrey}table.print-calendar{border:1px solid black;border-collapse:collapse;height:95%}.print-calendar th{border:1px solid black}#top th{border:none}table.inner{border:none}.calendar-allday td{text-align:center;border:1px solid black}.calendar-normal td{text-align:left}td.calendar-item{width:100%}.k-calendar-header{border:1px solid black}table.k-calendar-days{margin-top:5px}table.k-calendar-days th{border:1px solid black;text-align:center;background-color:lightgrey;width:14.28% !important}table.k-calendar-days td{border:1px solid #000;vertical-align:top;text-align:left}table.k-calendar-days td svg.k-appointment-status{position:absolute;display:inline-block;width:7px;top:0;left:0;bottom:0}table.k-calendar-days td .k-appointment{font-size:14px;width:90%;height:20px;border-radius:4px;line-height:1.5;background-color:#FFF;position:absolute;left:2.5%;margin-bottom:1px}table.k-calendar-days td .k-overflow-indicator{display:inline-block;position:absolute;bottom:0px;right:0px;height:10px}
/*# sourceMappingURL=print.calendar.css.map */
{
"version": 3,
"mappings": "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",
"sources": ["../../scss/external/_print.scss","../../scss/external/print.calendar.scss"],
"names": [],
"file": "print.calendar.css"
}
\ No newline at end of file
/* setting the margin to 0 makes some browsers use the full paper, and disabling their header and footers */
@page {
size: auto;
/* auto is the initial value */
margin-top: 0.5in;
margin-bottom: 0.5in;
margin-left: 0.5in;
margin-right: 0.5in;
}
@media print {
/* line 12, ../../scss/external/_print.scss */
thead {
display: table-header-group;
}
/* line 16, ../../scss/external/_print.scss */
#pagemargin {
min-height: 100%;
margin: 0;
}
}
/* common css to make some tags clear on paper */
/* line 23, ../../scss/external/_print.scss */
html, div, dl, dt, dd, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, p, blockquote, th, td {
margin: 0;
padding: 0;
}
/* line 27, ../../scss/external/_print.scss */
img, body, html {
border: 0;
}
/* line 30, ../../scss/external/_print.scss */
address, caption, cite, code, dfn, th, var {
font-style: normal;
font-weight: normal;
}
/* line 34, ../../scss/external/_print.scss */
caption, th {
text-align: left;
}
/* line 37, ../../scss/external/_print.scss */
h1, h2, h3, h4, h5, h6 {
font-size: 100%;
}
/* line 40, ../../scss/external/_print.scss */
q:before, q:after {
content: '';
}
/* common util classes */
/* line 45, ../../scss/external/_print.scss */
.nowrap {
white-space: nowrap;
}
/* line 48, ../../scss/external/_print.scss */
.wrap {
white-space: normal;
}
/* line 51, ../../scss/external/_print.scss */
.fullwidth {
width: 100%;
}
/* line 3, ../../scss/external/print.record.scss */
table {
width: 100%;
text-align: left;
font-size: 11px;
font-family: arial;
border-collapse: collapse;
}
/* line 11, ../../scss/external/print.record.scss */
table th {
width: 25%;
font-weight: bold;
padding: 2px 3px 2px 0px;
}
/* line 17, ../../scss/external/print.record.scss */
table td {
padding: 2px 3px 2px 0px;
}
@page{size:auto;margin-top:0.5in;margin-bottom:0.5in;margin-left:0.5in;margin-right:0.5in}@media print{thead{display:table-header-group}#pagemargin{min-height:100%;margin:0}}html,div,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0}img,body,html{border:0}address,caption,cite,code,dfn,th,var{font-style:normal;font-weight:normal}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:''}.nowrap{white-space:nowrap}.wrap{white-space:normal}.fullwidth{width:100%}table{width:100%;text-align:left;font-size:11px;font-family:arial;border-collapse:collapse}table th{width:25%;font-weight:bold;padding:2px 3px 2px 0px}table td{padding:2px 3px 2px 0px}
/*# sourceMappingURL=print.record.css.map */
{
"version": 3,
"mappings": "AACA,KAOC,CALG,IAAI,CAAE,IAAI,CACV,UAAU,CAAE,KAAK,CACjB,aAAa,CAAE,KAAK,CACpB,WAAW,CAAE,KAAK,CAClB,YAAY,CAAE,KAAK,CAGvB,YAAa,CACZ,KAAM,CACL,OAAO,CAAE,kBAAkB,CAG5B,WAAY,CACX,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,EAKX,8EAA+E,CAC9E,MAAM,CAAC,CAAC,CACR,OAAO,CAAC,CAAC,CAEV,aAAc,CACb,MAAM,CAAC,CAAC,CAET,oCAAqC,CACpC,UAAU,CAAC,MAAM,CACjB,WAAW,CAAC,MAAM,CAEnB,UAAW,CACV,UAAU,CAAC,IAAI,CAEhB,iBAAkB,CACjB,SAAS,CAAC,IAAI,CAEf,gBAAgB,CACf,OAAO,CAAC,EAAE,CAIX,OAAQ,CACP,WAAW,CAAE,MAAM,CAEpB,KAAM,CACL,WAAW,CAAE,MAAM,CAEpB,UAAW,CACV,KAAK,CAAE,IAAI,CCjDZ,KAAM,CACJ,KAAK,CAAE,IAAI,CACX,UAAU,CAAE,IAAI,CAChB,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,KAAK,CAClB,eAAe,CAAE,QAAQ,CAG3B,QAAS,CACP,KAAK,CAAE,GAAG,CACV,WAAW,CAAE,IAAI,CACjB,OAAO,CAAE,eAAe,CAG1B,QAAS,CACP,OAAO,CAAE,eAAe",
"sources": ["../../scss/external/_print.scss","../../scss/external/print.record.scss"],
"names": [],
"file": "print.record.css"
}
\ No newline at end of file
/* setting the margin to 0 makes some browsers use the full paper, and disabling their header and footers */
@page {
size: auto;
/* auto is the initial value */
margin-top: 0.5in;
margin-bottom: 0.5in;
margin-left: 0.5in;
margin-right: 0.5in;
}
@media print {
/* line 12, ../../scss/external/_print.scss */
thead {
display: table-header-group;
}
/* line 16, ../../scss/external/_print.scss */
#pagemargin {
min-height: 100%;
margin: 0;
}
}
/* common css to make some tags clear on paper */
/* line 23, ../../scss/external/_print.scss */
html, div, dl, dt, dd, h1, h2, h3, h4, h5, h6, pre, form, fieldset, input, p, blockquote, th, td {
margin: 0;
padding: 0;
}
/* line 27, ../../scss/external/_print.scss */
img, body, html {
border: 0;
}
/* line 30, ../../scss/external/_print.scss */
address, caption, cite, code, dfn, th, var {
font-style: normal;
font-weight: normal;
}
/* line 34, ../../scss/external/_print.scss */
caption, th {
text-align: left;
}
/* line 37, ../../scss/external/_print.scss */
h1, h2, h3, h4, h5, h6 {
font-size: 100%;
}
/* line 40, ../../scss/external/_print.scss */
q:before, q:after {
content: '';
}
/* common util classes */
/* line 45, ../../scss/external/_print.scss */
.nowrap {
white-space: nowrap;
}
/* line 48, ../../scss/external/_print.scss */
.wrap {
white-space: normal;
}
/* line 51, ../../scss/external/_print.scss */
.fullwidth {
width: 100%;
}
/* line 3, ../../scss/external/print.task.scss */
table {
width: 100%;
text-align: left;
font-size: 11px;
font-family: arial;
border-collapse: collapse;
}
/* line 11, ../../scss/external/print.task.scss */
table th {
font-weight: bold;
padding: 2px 3px 2px 0px;
}
/* line 16, ../../scss/external/print.task.scss */
table td {
padding: 2px 3px 2px 0px;
}
/* line 20, ../../scss/external/print.task.scss */
table.task-list {
border: 1px solid black;
border-collapse: collapse;
}
/* line 24, ../../scss/external/print.task.scss */
.task-list th {
border: 1px solid black;
text-align: left;
background-color: lightgrey;
}
/* line 29, ../../scss/external/print.task.scss */
.task-list td {
border-top: 1px solid black;
border-bottom: 1px solid black;
border-collapse: collapse;
text-align: left;
}
@page{size:auto;margin-top:0.5in;margin-bottom:0.5in;margin-left:0.5in;margin-right:0.5in}@media print{thead{display:table-header-group}#pagemargin{min-height:100%;margin:0}}html,div,dl,dt,dd,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0}img,body,html{border:0}address,caption,cite,code,dfn,th,var{font-style:normal;font-weight:normal}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%}q:before,q:after{content:''}.nowrap{white-space:nowrap}.wrap{white-space:normal}.fullwidth{width:100%}table{width:100%;text-align:left;font-size:11px;font-family:arial;border-collapse:collapse}table th{font-weight:bold;padding:2px 3px 2px 0px}table td{padding:2px 3px 2px 0px}table.task-list{border:1px solid black;border-collapse:collapse}.task-list th{border:1px solid black;text-align:left;background-color:lightgrey}.task-list td{border-top:1px solid black;border-bottom:1px solid black;border-collapse:collapse;text-align:left}
/*# sourceMappingURL=print.task.css.map */
{
"version": 3,
"mappings": "AACA,KAOC,CALG,IAAI,CAAE,IAAI,CACV,UAAU,CAAE,KAAK,CACjB,aAAa,CAAE,KAAK,CACpB,WAAW,CAAE,KAAK,CAClB,YAAY,CAAE,KAAK,CAGvB,YAAa,CACZ,KAAM,CACL,OAAO,CAAE,kBAAkB,CAG5B,WAAY,CACX,UAAU,CAAE,IAAI,CAChB,MAAM,CAAE,CAAC,EAKX,8EAA+E,CAC9E,MAAM,CAAC,CAAC,CACR,OAAO,CAAC,CAAC,CAEV,aAAc,CACb,MAAM,CAAC,CAAC,CAET,oCAAqC,CACpC,UAAU,CAAC,MAAM,CACjB,WAAW,CAAC,MAAM,CAEnB,UAAW,CACV,UAAU,CAAC,IAAI,CAEhB,iBAAkB,CACjB,SAAS,CAAC,IAAI,CAEf,gBAAgB,CACf,OAAO,CAAC,EAAE,CAIX,OAAQ,CACP,WAAW,CAAE,MAAM,CAEpB,KAAM,CACL,WAAW,CAAE,MAAM,CAEpB,UAAW,CACV,KAAK,CAAE,IAAI,CCjDZ,KAAM,CACL,KAAK,CAAE,IAAI,CACX,UAAU,CAAE,IAAI,CAChB,SAAS,CAAE,IAAI,CACf,WAAW,CAAE,KAAK,CAClB,eAAe,CAAE,QAAQ,CAG1B,QAAS,CACR,WAAW,CAAE,IAAI,CACjB,OAAO,CAAE,eAAe,CAGzB,QAAS,CACR,OAAO,CAAE,eAAe,CAGzB,eAAgB,CACf,MAAM,CAAE,eAAe,CACvB,eAAe,CAAE,QAAQ,CAE1B,aAAc,CACb,MAAM,CAAE,eAAe,CACvB,UAAU,CAAE,IAAI,CACb,gBAAgB,CAAE,SAAS,CAE/B,aAAc,CACb,UAAU,CAAE,eAAe,CAC3B,aAAa,CAAE,eAAe,CAC9B,eAAe,CAAE,QAAQ,CACzB,UAAU,CAAE,IAAI",
"sources": ["../../scss/external/_print.scss","../../scss/external/print.task.scss"],
"names": [],
"file": "print.task.css"
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
......@@ -13,16 +13,38 @@ $font-line-height-extra-large : 25px;
$font-line-height-small : 15px;
$font-line-height-mail-grid-compact : $font-default-size + 2px;
/*
* Remember, !important is very fugly! But in this case it is used because we want to force only one font accross the WebApp
* and this is a very easy way to overwrite all those font-settings that Ext does.
*/
@mixin basefont($size){
font-family: arial, tahoma, helvetica, sans-serif !important;
font-size: $size !important;
font-family: arial, tahoma, helvetica, sans-serif;
font-size: $size;
}
body * :not(.mce-ico) {
/* Set our preferred font on the body and all selectors that Ext has used to change the default font */
body,
.x-panel-header,
.x-panel-mc,
.x-panel-tl .x-panel-header,
.x-form-item,
.x-form-field,
.x-small-editor .x-form-field,
.ext-webkit .x-small-editor .x-form-field,
.x-toolbar td, .x-toolbar span, .x-toolbar input, .x-toolbar div, .x-toolbar select, .x-toolbar label,
.x-tree-node,
.x-tab-strip span.x-tab-strip-text,
.x-grid3-hd-row td,
.x-grid3-row td, .x-grid3-summary-row td,
.x-grid-empty,
.x-menu-list-item,
.x-tip .x-tip-mc,
.x-tip .x-tip-body,
.x-window-tl .x-window-header,
.x-window-dlg .ext-mb-text, .x-window-dlg .x-window-header-text,
.x-window-mc,
.x-btn button,
.x-date-mp-btns button,
.x-dd-drag-ghost,
.ext-el-mask-msg div,
.x-date-inner a,
.x-date-mp td
{
@include basefont($font-default-size);
}
......@@ -9,24 +9,6 @@ $action-fontcolor : $font-color-light;
$normal-button-bgcolor : $grey;
$normal-button-bgcolor-hover : $grey2;
/* Mixin for special button, usually with a different background and font color */
@mixin action-button() {
background-color: $action-bgcolor;
color: $action-fontcolor;
min-width: 84px;
height: 24px; /* Overriden from style.css */
font-size: 13px;
}
@mixin action-button-hover() {
background-color: $action-bgcolor-hover;
}
@mixin action-button-active() {
background-color: $action-bgcolor;
box-shadow: inset 0px 1px 1px 0px rgba(0, 0, 0, 0.35);
}
/**************************************
* General buttons
*************************************/
......
......@@ -330,6 +330,12 @@ td.x-grid3-hd-menu-open .x-grid3-hd-inner {
.x-grid3-row-over .k-category-fixed .k-grid-button-delete {
display: none;
}
/* Additional categories cannot be edited or deleted because they are
defined by the admin */
.x-grid3-row-over .k-category-additional .k-grid-button-edit,
.x-grid3-row-over .k-category-additional .k-grid-button-delete {
display: none;
}
.x-grid3 .zarafa-pinned .k-grid-button-pin {
display: block;
......
......@@ -40,7 +40,6 @@
.zarafa-notifier-popup-item-title
{
font-weight : bold;
font-size : 1.3em;
}
.zarafa-notifier-container
{
......
......@@ -658,7 +658,7 @@ Ext.apply(Zarafa, {
name : pgettext('hierarchy.foldername', 'Tasks')
},{
type : 'junk',
name : pgettext('hierarchy.foldername', 'Junk E-mail')
name : pgettext('hierarchy.foldername', 'Junk Email')
}];
var missing = [];
......
......@@ -21,7 +21,7 @@ Zarafa.addressbook.dialogs.ABEmailAddressTab = Ext.extend(Ext.form.FormPanel, {
Ext.applyIf(config, {
xtype : 'zarafa.abemailaddresstab',
title : _('E-mail Addresses'),
title : _('Email Addresses'),
layout: {
type: 'vbox',
pack : 'start',
......@@ -29,7 +29,7 @@ Zarafa.addressbook.dialogs.ABEmailAddressTab = Ext.extend(Ext.form.FormPanel, {
},
items : [{
xtype : 'displayfield',
value : _('E-mail addresses') + ':',
value : _('Email addresses') + ':',
hideLabel : true
},{
xtype : 'panel',
......
......@@ -927,12 +927,23 @@ Zarafa.advancesearch.dialogs.SearchToolBoxPanel = Ext.extend(Ext.Panel, {
Ext.each(values, function(value) {
if (value === 'hasattach') {
orFilters.push(
Zarafa.core.data.RestrictionFactory.dataResProperty(
value,
Zarafa.core.mapi.Restrictions.RELOP_EQ,
true
Zarafa.core.data.RestrictionFactory.createResAnd([
Zarafa.core.data.RestrictionFactory.dataResProperty(
'hide_attachments',
Zarafa.core.mapi.Restrictions.RELOP_NE,
true
),
Zarafa.core.data.RestrictionFactory.createResSubRestriction(
'PR_MESSAGE_ATTACHMENTS',
Zarafa.core.data.RestrictionFactory.dataResProperty(
'PR_ATTACHMENT_HIDDEN',
Zarafa.core.mapi.Restrictions.RELOP_NE,
true
)
)
])
);
}
if (value === 'message_flags') {
orFilters.push(
......
......@@ -613,7 +613,9 @@ Zarafa.calendar.ui.AbstractCalendarDaysView = Ext.extend(Zarafa.calendar.ui.Abst
var clusters = this.getAppointmentClusters(bodyAppointments);
Ext.each(clusters, this.doGreedyColoring, this);
clusters.forEach(function(cluster) {
this.doGreedyColoring(cluster, false);
}, this);
},
/**
......
......@@ -31,9 +31,33 @@ Zarafa.common.categories.data.CategoriesStore = Ext.extend(Ext.data.ArrayStore,
config = config || {};
var categories = [];
categories = categories.concat(container.getPersistentSettingsModel().get(this.settingsKey));
var storedCategories = container.getPersistentSettingsModel().get(this.settingsKey);
if ( storedCategories ) {
categories = categories.concat(container.getPersistentSettingsModel().get(this.settingsKey));
}
categories = categories.concat(container.populateInsertionPoint('main.categories'));
// Add additonal categories defined by the admin. They are already defined by the default
// persistent settings, but the user might have removed/changed them and since KW-2841 we
// always want to have those categories available
var additionalCategories = container.getServerConfig().getAdditionalDefaultCategories() || [];
var newAdditionalCategories = additionalCategories.filter(function(category) {
return !categories.some(function(c) {
return c.name === category.name;
});
});
// Remove stored additional categories that are not present in the configured addtional categories
categories = categories.filter(function(category) {
return !category.additional ||
additionalCategories.some(function(additionalCategory) {
return additionalCategory.name === category.name;
});
});
// Add new additional categories
categories = categories.concat(newAdditionalCategories);
categories = categories.filter(function(category){
return Ext.isObject(category);
}).map(function(category){
......@@ -41,6 +65,7 @@ Zarafa.common.categories.data.CategoriesStore = Ext.extend(Ext.data.ArrayStore,
category.name,
category.color,
category.standardIndex,
additionalCategories.some(function(c) { return c.name === category.name; }),
category.quickAccess===true,
Ext.isDefined(category.sortIndex) ? category.sortIndex : 100000,
true,
......@@ -49,7 +74,7 @@ Zarafa.common.categories.data.CategoriesStore = Ext.extend(Ext.data.ArrayStore,
});
Ext.applyIf(config, {
fields : ['category', 'color', 'standardIndex', 'quickAccess', 'sortIndex', 'stored', 'used'],
fields : ['category', 'color', 'standardIndex', 'additional', 'quickAccess', 'sortIndex', 'stored', 'used'],
data: categories
});
......@@ -114,7 +139,8 @@ Zarafa.common.categories.data.CategoriesStore = Ext.extend(Ext.data.ArrayStore,
standardIndex: categoryRecord.get('standardIndex'),
quickAccess: categoryRecord.get('quickAccess'),
sortIndex: categoryRecord.get('sortIndex'),
used: categoryRecord.get('used')
used: categoryRecord.get('used'),
additional: categoryRecord.get('additional')
};
});
......
......@@ -188,6 +188,9 @@ Zarafa.common.categories.dialogs.CategoriesPanel = Ext.extend(Ext.Panel, {
{
var cls = record.get('quickAccess') ? ' zarafa-pinned' : '';
cls += Ext.isNumber(record.get('standardIndex')) ? ' k-category-fixed' : '';
if ( record.get('additional') ) {
cls += ' k-category-additional';
}
if(this.hideActionButtons) {
return Ext.util.Format.htmlEncode(value);
......
......@@ -47,7 +47,7 @@ Zarafa.common.recipientfield.ui.EditRecipientContentPanel = Ext.extend(Zarafa.co
anchor: '100%'
},{
xtype: 'textfield',
fieldLabel: _('E-mail address'),
fieldLabel: _('Email address'),
allowBlank : false,
vtype : 'email',
name: 'smtp_address',
......
......@@ -109,7 +109,7 @@ Zarafa.common.recipientfield.ui.RecipientContextMenu = Ext.extend(Zarafa.core.ui
},
/**
* Handler for the "E-mail Recipient" option. This will create
* Handler for the "Email Recipient" option. This will create
* a new {@link Zarafa.core.data.MAPIRecord mail record}
* and generate new phantom recipient for new mail. Then
* it will open a new MailCreate ContentPanel for the new mail
......
......@@ -239,7 +239,7 @@ Zarafa.common.recipientfield.ui.RecipientHoverCardView = Ext.extend(Ext.Window,
},
/**
* Handler for the "E-mail Recipient" option. This will create
* Handler for the "Email Recipient" option. This will create
* a new {@link Zarafa.core.data.MAPIRecord mail record}
* and generate new phantom recipient for new mail. Then
* it will open a new MailCreate ContentPanel for the new mail
......
......@@ -48,7 +48,7 @@ Zarafa.common.recipientfield.ui.ViewRecipientContentPanel = Ext.extend(Zarafa.co
readOnly : true
},{
xtype: 'textfield',
fieldLabel: _('E-mail address'),
fieldLabel: _('Email address'),
name: 'smtp_address',
anchor: '100%',
readOnly : true
......
......@@ -53,7 +53,7 @@ Zarafa.contact.dialogs.DistlistMemberGridColumnModel = Ext.extend(Ext.grid.Colum
renderer : Zarafa.common.ui.grid.Renderers.text
},{
dataIndex : 'smtp_address',
header : _('E-mail Address'),
header : _('Email Address'),
tooltip : _('Sort by: Email Address'),
width : 350,
renderer : Zarafa.common.ui.grid.Renderers.text
......
......@@ -43,12 +43,12 @@ Zarafa.contact.printer.ContactRenderer = Ext.extend(Zarafa.common.printer.render
html += this.optionalRow(_('Mobile'), 'cellular_telephone_number', '{cellular_telephone_number}');
html += this.optionalRow(_('Business Fax'), 'business_fax_number', '{business_fax_number}');
html += this.addRow('', ''); // separator
html += this.optionalRow(_('E-mail'), 'email_address_1', '{email_address_1}');
html += this.optionalRow(_('E-mail Display As'), 'email_address_display_name_1', '{email_address_display_name_1}');
html += this.optionalRow(_('E-mail 2'), 'email_address_2', '{email_address_2}');
html += this.optionalRow(_('E-mail 2 Display As'), 'email_address_display_name_2', '{email_address_display_name_2}');
html += this.optionalRow(_('E-mail 3'), 'email_address_3', '{email_address_3}');
html += this.optionalRow(_('E-mail 3 Display As'), 'email_address_display_name_3', '{email_address_display_name_3}');
html += this.optionalRow(_('Email'), 'email_address_1', '{email_address_1}');
html += this.optionalRow(_('Email Display As'), 'email_address_display_name_1', '{email_address_display_name_1}');
html += this.optionalRow(_('Email 2'), 'email_address_2', '{email_address_2}');
html += this.optionalRow(_('Email 2 Display As'), 'email_address_display_name_2', '{email_address_display_name_2}');
html += this.optionalRow(_('Email 3'), 'email_address_3', '{email_address_3}');
html += this.optionalRow(_('Email 3 Display As'), 'email_address_display_name_3', '{email_address_display_name_3}');
html += this.addRow('', ''); // separator
// # TRANSLATORS: See http://docs.sencha.com/ext-js/3-4/#!/api/Date for the meaning of these formatting instructions
html += this.optionalRow(_('Birthday'), 'birthday', '{birthday:date("' + _("jS F Y") + '")}'); // 1st January 1912
......
......@@ -330,13 +330,14 @@ Zarafa.core.data.MAPIStore = Ext.extend(Ext.data.GroupingStore, {
* 'list' action. function will call {@link #execute} event, which is entry point for every
* CRUD operation, {@link #execute} will internall call {@link #createCallback} to create a
* callback function based on operation type ('open' -> onOpenRecords).
* @param {Zarafa.core.data.MAPIRecord} record record for which we need extra properties.
* @param {Object} options Extra options which can be used for opening the record
* @param {Zarafa.core.data.MAPIRecord[]} records records for which we need extra properties.
* @param {Object} options Extra options which can be used for opening the records
* @return {Boolean|undefined} false when this.execute fails
*/
open : function(record, options)
open : function(records, options)
{
try {
return this.execute('open', record, options);
return this.execute('open', records, options);
} catch (e) {
this.handleException(e);
return false;
......@@ -345,14 +346,35 @@ Zarafa.core.data.MAPIStore = Ext.extend(Ext.data.GroupingStore, {
/**
* Function will work as callback function for 'open' operation, and update the
* existing record with the new data that is received from server.
* existing records with the new data that is received from server.
* @param {Boolean} success true if operation completed successfully else false.
* @param {Zarafa.core.data.MAPIRecord} record updated record.
* @param {Object} data properties of record which is received from server (in key/value pair).
* @param {Zarafa.core.data.MAPIRecord|Zarafa.core.dataMAPIRecord[]} records updated records.
* @param {Object|Array} data properties of records which is received from server (in key/value pair).
*/
onOpenRecords : function(success, record, data)
onOpenRecords : function(success, records, data)
{
if (success === true && this.indexOf(record) > -1) {
if (success !== true) {
return;
}
if (!Array.isArray(records)) {
records = [ records ];
}
records.forEach(function(record) {
if (this.indexOf(record) === -1) {
return;
}
// Opening items in batch passes multiple records but only one data object per onOpenRecords
// call, therefore the entryid has to be compared to update the correct record.
// Also opening meeting requests passes the task request as record and expects the actual task to
// be applied onto the record, here the entryids don't match so just check if records length is not 1.
if (records.length !== 1 && Array.isArray(data) && data.length !== 0 &&
!Zarafa.core.EntryId.compareEntryIds(record.get('entryid'), data[0].entryid)) {
return;
}
try {
// call reader to update record data
var oldRecord = record;
......@@ -363,12 +385,8 @@ Zarafa.core.data.MAPIStore = Ext.extend(Ext.data.GroupingStore, {
this.fireEvent('open', this, record, oldRecord);
} catch (e) {
this.handleException(e);
if (Array.isArray(record)) {
// Recurse to run back into the try {}. DataReader#update splices-off the rs until empty.
this.onOpenRecords(success, record, data);
}
}
}
}, this);
},
/**
......
......@@ -316,5 +316,21 @@ Zarafa.core.data.ServerConfig = Ext.extend(Object, {
getSharedStorePollingInterval : function()
{
return this.meta.shared_store_polling_interval * 60000;
},
/**
* @return {Number} return the amount of emails to load in the background
*/
getPrefetchTotalCount : function()
{
return this.meta.prefetch_email_count;
},
/**
* @return {Number} return the interval in microseconds to load new emails in the background.
*/
getPrefetchInterval : function()
{
return this.meta.prefetch_email_interval * 1000;
}
});
......@@ -1011,7 +1011,7 @@ Zarafa.hierarchy.data.HierarchyStore = Ext.extend(Zarafa.core.data.IPFStore, {
/**
* Returns folder(s) which has the provided container-class except folders
* in "deleted items" or "Junk E-mail".
* in "deleted items" or "Junk Email".
* @param {String} containerClass The container_class of the folders.
* @return {Zarafa.core.data.IPFRecord[]} An array of folders
*/
......
......@@ -57,7 +57,7 @@ Zarafa.hierarchy.ui.ContextMenu = Ext.extend(Zarafa.core.ui.menu.ConditionalMenu
var folderName = _('Empty folder');
var record = config.records;
if (record.isSpecialFolder('junk')) {
folderName = _('Empty Junk E-mail');
folderName = _('Empty Junk Email');
} else if (record.isSpecialFolder('wastebasket')) {
folderName = _('Empty Deleted Items');
}
......
......@@ -199,8 +199,8 @@ Zarafa.hierarchy.ui.TreeSorter = Ext.extend(Ext.tree.TreeSorter, {
// When sorting on display name, we will use the 'fully qualified display name', so
// we will use 'Calendar of Hank Bla' instead of just 'Calendar' to sort.
var v1 = property = 'display_name' && record1.getFullyQualifiedDisplayName ? record1.getFullyQualifiedDisplayName() : record1.get(property);
var v2 = property = 'display_name' && record2.getFullyQualifiedDisplayName ? record2.getFullyQualifiedDisplayName() : record2.get(property);
var v1 = property == 'display_name' && record1.getFullyQualifiedDisplayName ? record1.getFullyQualifiedDisplayName() : record1.get(property);
var v2 = property == 'display_name' && record2.getFullyQualifiedDisplayName ? record2.getFullyQualifiedDisplayName() : record2.get(property);
// For case insensitive sorting, convert to lowercase, this will correctly position
// folders which start with '_' to be sorted first (when converting to uppercase, those
......
......@@ -12,7 +12,7 @@ Zarafa.mail.Actions = {
* further edited.
*
* @param {Zarafa.mail.MailContextModel} model Context Model object that will be used
* to {@link Zarafa.mail.MailContextModel#createRecord create} the E-Mail.
* to {@link Zarafa.mail.MailContextModel#createRecord create} the email.
* @param {Object} config (optional) Configuration object used to create
* the Content Panel.
*/
......
......@@ -15,6 +15,30 @@ Zarafa.mail.MailContextModel = Ext.extend(Zarafa.core.ContextModel, {
*/
oldDataMode : undefined,
/**
* Amount of items to load per batch.
* @property
* @type Number
* @private
*/
prefetchBathCount: 5,
/**
* Amount of items which are loaded in the background.
* @property
* @type Number
* @private
*/
prefetchedTotal: 0,
/**
* The id of the background load deffered task, used to clear the timer.
* @property
* @type Number
* @private
*/
prefetchItemTask: undefined,
/**
* @constructor
* @param {Object} config Configuration object
......@@ -39,6 +63,11 @@ Zarafa.mail.MailContextModel = Ext.extend(Zarafa.core.ContextModel, {
'searchstop' : this.onSearchStop,
scope : this
});
if (container.getServerConfig().getPrefetchTotalCount() > 0) {
config.store.on('load', this.setupLazyLoadMail, this, {delay: 800, buffer: 5});
}
container.on('contextswitch', this.onContextSwitch, this);
},
/**
......@@ -133,7 +162,11 @@ Zarafa.mail.MailContextModel = Ext.extend(Zarafa.core.ContextModel, {
}
if (isMultipleItems) {
responseRecord.set('subject', _('FW') + ': ');
if (container.getSettingsModel().get('zarafa/v1/contexts/mail/use_english_abbreviations')) {
responseRecord.set('subject', ('FW') + ': ');
} else {
responseRecord.set('subject', _('FW') + ': ');
}
}
// If the record we are replying is in other user's store then set delegator info.
......@@ -195,16 +228,25 @@ Zarafa.mail.MailContextModel = Ext.extend(Zarafa.core.ContextModel, {
initRecordSubject : function(record, origRecord, actionType)
{
var subjectPrefix;
var english_abb = container.getSettingsModel().get('zarafa/v1/contexts/mail/use_english_abbreviations');
switch (actionType)
{
case Zarafa.mail.data.ActionTypes.REPLY:
case Zarafa.mail.data.ActionTypes.REPLYALL:
subjectPrefix = _('RE') + ': ';
if (english_abb) {
subjectPrefix = ('RE') + ': ';
} else {
subjectPrefix = _('RE') + ': ';
}
break;
case Zarafa.mail.data.ActionTypes.FORWARD:
case Zarafa.mail.data.ActionTypes.FORWARD_ATTACH:
subjectPrefix = _('FW') + ': ';
if (english_abb) {
subjectPrefix = ('FW') + ': ';
} else {
subjectPrefix = _('FW') + ': ';
}
break;
case Zarafa.mail.data.ActionTypes.EDIT_AS_NEW:
subjectPrefix = '';
......@@ -727,6 +769,8 @@ Zarafa.mail.MailContextModel = Ext.extend(Zarafa.core.ContextModel, {
*/
onFolderChange : function(model, folders)
{
this.resetLazyLoadMail();
if(!Ext.isEmpty(folders)) {
var folder = folders[0];
var folderKey = folder.getDefaultFolderKey();
......@@ -772,5 +816,68 @@ Zarafa.mail.MailContextModel = Ext.extend(Zarafa.core.ContextModel, {
this.setDataMode(this.oldDataMode);
}
delete this.oldDataMode;
},
/**
* Resets the lazy load mail related variables.
*/
resetLazyLoadMail: function() {
this.prefetchedTotal = 0;
window.clearTimeout(this.prefetchItemTask);
},
/**
* Setup lazy loading of mail bodies.
* @param {Ext.data.Store} store The store which was loaded
* @param {Ext.data.Record[]} records The records which were loaded from the store
*/
setupLazyLoadMail: function(store, records) {
this.resetLazyLoadMail();
this.lazyLoadMail(store, records);
},
/**
* Event handler for {@link #load load} event of the mail store.
* This will lazy load items in the background in a batch.
* @param {Ext.data.Store} store The store which was loaded
* @param {Ext.data.Record[]} records The records which were loaded from the store
*/
lazyLoadMail: function(store, records) {
const unOpened = records.filter(function(record) {
return (
!record.isOpened() && // No records that were already opened
record.isMessageClass(['IPM.Note'], true) && // Only mails
!record.isMessageClass(['IPM.Note.SMIME'], true) &&
store.indexOf(record) >= 0 // No records that were deleted during the 'defer time'
);
});
const loadItems = unOpened.slice(0, this.prefetchBathCount);
if (!Ext.isEmpty(loadItems)) {
store.open(loadItems);
}
this.prefetchedTotal += loadItems.length;
// Start delayed task to fetch remainder of lazy loaded items
if (unOpened.length > 0 && this.prefetchedTotal < container.getServerConfig().getPrefetchTotalCount()) {
this.prefetchItemTask = this.lazyLoadMail.defer(container.getServerConfig().getPrefetchInterval(), this, [store, unOpened]);
}
},
/**
* Event handler for the {@link Zarafa.core.Container.contextswitch contextswitch}
* event of the {@link Zarafa.core.Container Container} Will clear the batch item deferred task and amount
* of fetched items.
* @param {Zarafa.hierarchy.data.MAPIFolderRecord} folder folder that is loaded for the new context
* @param {Zarafa.core.Context} oldContext context that was switched out
* @param {Zarafa.core.Context} newContext new context that was switched
*/
onContextSwitch : function(folder, oldContext, newContext)
{
if ( newContext.getName() !== 'mail' ) {
this.resetLazyLoadMail();
}
}
});
......@@ -21,10 +21,10 @@ Zarafa.mail.dialogs.MailCreateContentPanel = Ext.extend(Zarafa.core.ui.MessageCo
showbcc : false,
/**
* @cfg {Boolean} use_html_editor True to enable the HTML editor in this panel
* @cfg {Boolean} useHtml True to enable the HTML editor in this panel
* If not provided, the value will be obtained from the {@link Zarafa.settings.SettingsModel}.
*/
use_html_editor : false,
useHtml : false,
/**
* True if the From field should be shown.
......@@ -51,8 +51,8 @@ Zarafa.mail.dialogs.MailCreateContentPanel = Ext.extend(Zarafa.core.ui.MessageCo
{
config = config || {};
if (!Ext.isDefined(config.use_html_editor)) {
config.use_html_editor = container.getSettingsModel().get('zarafa/v1/contexts/mail/dialogs/mailcreate/use_html_editor');
if (!Ext.isDefined(config.useHtml)) {
config.useHtml = container.getSettingsModel().get('zarafa/v1/contexts/mail/dialogs/mailcreate/use_html_editor');
}
config.plugins = Ext.value(config.plugins, []);
......@@ -68,7 +68,7 @@ Zarafa.mail.dialogs.MailCreateContentPanel = Ext.extend(Zarafa.core.ui.MessageCo
xtype : 'zarafa.mailcreatecontentpanel',
// Override from Ext.Component
layout : 'fit',
title : _('E-Mail'),
title : _('Email'),
recordComponentPluginConfig : Ext.applyIf(config.recordComponentPluginConfig || {}, {
allowWrite : true
}),
......@@ -77,7 +77,7 @@ Zarafa.mail.dialogs.MailCreateContentPanel = Ext.extend(Zarafa.core.ui.MessageCo
items: [{
xtype: 'zarafa.mailcreatepanel',
ref: 'mainPanel',
use_html_editor : config.use_html_editor,
useHtml : config.useHtml,
tbar :{
xtype: 'zarafa.mailcreatetoolbar'
}
......@@ -143,15 +143,9 @@ Zarafa.mail.dialogs.MailCreateContentPanel = Ext.extend(Zarafa.core.ui.MessageCo
return;
}
// If there isn't any message action set on the record then it is just save mail action.
// If there isn't any message action set on the record, then it's just the save mail action.
if (this.isSaving && !this.isSending) {
var message;
if (success === false) {
message = _('Message saving failed.');
} else {
message = String.format(_('Message Saved at {0}.'), this.record.get('last_modification_time').format(_('g:i A')));
}
var message = (success) ? String.format(_('Saved at {0}'), this.record.get('last_modification_time').format(_('g:i A'))) : _('Saving failed');
container.getNotifier().notify('info.mailsaved', message, {
toolbar : this.mainPanel.getTopToolbar()
});
......
......@@ -9,9 +9,9 @@ Ext.namespace('Zarafa.mail.dialogs');
*/
Zarafa.mail.dialogs.MailCreatePanel = Ext.extend(Ext.form.FormPanel, {
/**
* @cfg {Boolean} use_html_editor True to enable the HTML editor in this panel.
* @cfg {Boolean} useHtml True to enable the HTML editor in this panel.
*/
use_html_editor : false,
useHtml : false,
/**
* @constructor
......@@ -252,6 +252,7 @@ Zarafa.mail.dialogs.MailCreatePanel = Ext.extend(Ext.form.FormPanel, {
enableKeyEvents : true,
ref: 'editorField',
hideLabel: true,
useHtml:config.useHtml,
flex: 1,
listeners: {
change : this.onBodyChange,
......@@ -276,7 +277,7 @@ Zarafa.mail.dialogs.MailCreatePanel = Ext.extend(Ext.form.FormPanel, {
// record will contain body only when its already opened
if(record.isOpened()) {
if(contentReset) {
this.editorField.setHtmlEditor(this.use_html_editor, false);
this.editorField.setHtmlEditor(this.useHtml, false);
this.editorField.bindRecord(record);
this.editorField.setValue(record.getBody(this.editorField.isHtmlEditor()));
}
......
Ext.namespace('Zarafa.mail.dialogs');
/**
* @class Zarafa.mail.dialogs.MailFlagsContentPanel
* @extends Zarafa.core.ui.RecordContentPanel
* @xtype zarafa.mailflagscontentpanel
*/
Zarafa.mail.dialogs.MailFlagsContentPanel = Ext.extend(Zarafa.core.ui.RecordContentPanel, {
/**
* @cfg {Boolean} disableFlagColor if true then flag color combo will be disabled,
* it is used by new mail content panel.
*/
disableFlagColor : false,
/**
* @cfg {Boolean} disableCompleted if true then completed checkbox will be disabled,
* it is used by new mail content panel.
*/
disableCompleted : false,
/**
* @constructor
* @param config Configuration structure
*/
constructor : function(config)
{
config = config || {};
// Add in some standard configuration data.
config = Ext.applyIf(config, {
// Override from Ext.Component
xtype : 'zarafa.mailflagscontentpanel',
// Override from Ext.Component
layout : 'fit',
width: 350,
height: 150,
items: [{
xtype: 'zarafa.mailflagspanel',
disableFlagColor : Ext.isBoolean(config.disableFlagColor) ? config.disableFlagColor : this.disableFlagColor,
disableCompleted : Ext.isBoolean(config.disableCompleted) ? config.disableCompleted : this.disableCompleted,
buttons: [{
text: _('Ok'),
handler: this.onOk,
scope: this
},{
text: _('Cancel'),
handler: this.onCancel,
scope: this
}]
}],
autoSave : Ext.isDefined(config.modal) ? config.modal : true,