index
:
chouette-core
0000-cr-for-5024
0000-enhanced-table-builder
0000-gemfile-multiple-nulldb-entries
0000-import_dir_in_docker
0000-post_to_json_hotfix_for_local_app
0000-proposal-through_if
0000-refactor_netex_file
0000-specs-easy-zip-setup
0000-transport-mode-validation
3126-referentials-lines--search-for-routes-by-first-and-last-stop-area-name
3479-migrate-Lines#index-table-builder-helper-to-new-table-builder
3479-table-builder-helper--fix-bug-where-decorator-links-not-rendered-if-no-link-actions-passed-to-helper
3521-workbench_output_controller
3542-referential-overview
3562_ccset_affectation
4155-ensure-new-Netex-imports-have-associated-referential-and-workbench
4401-compliance-control-ModelAttribute--address-Robert,s-comments
4431-permission-renaming
4442-api_keys-permissions-spex
4443-edit-metadata
4466-compliance_control_sets
4467_compliance_control_crud
4477-import-unzip-to-files
4516_cleanup_rule_parameter_set
4633-import-handle-incorrect-zip
4655-dashboard-controller
4658-remove-current-functional-scope
4658-remove-current_functional_scope
4663-compliance_controls_layouts
4698-table_pages_title_refactoring
4706-mofify_sub/transport_modes
4707-simplify-compliance-control-copy
4709-compliance-check-criticity-as-string
4726-breadcrumb
4727-clone-compliance-control-set
4728-hstore-presence-validation
4774-compliance_control_sets-filters
4776-compliance_controls_policy
4800-hstore-numeric-validation
4812-display_empty_compliance_control_blocks
4817-better-traduction
4820_refactoring_breadcrumb
4824-create_line_referentials
4944_remove_route_section_code
4951-spec-to-validate-that-primary-and-foreign-keys-in-the-database-are-type-bigint
4981_last_editor
4986-compliance_control_sets_fix
4987-compliance_check-sets_show
5006-wb_import_filter_refs_with_foreign_lines
5102-begin_of_association_chain
5102-verify_line-refs_org_in_controllers
5111-begin_of_association_chain
5111-verify_stop_area_org_in_controllers
5113-update-logo
5119_i18n_dashboard
5129-import-report-button
5130-del_fk_compliance_ctrl_set_in_compliance_check_sets
5137-timetable-color
5140-wb_index_show_only_collaborators
5150_decorator_policy
5156-handle-long-distance-routes
5163-5164-export-csv
5179-ref_creation_enforces_objectid_format
5197-compliance-control-set-view-spec
5198-bis-wkbch-view-spec-modal-with-js
5206-multiple-selection-refactoring
5253-truncate-breadcrumb
5281-workbench-import-structural-bug-reading-zip
5287-clean-links-in-stop-areas-index
5291-disable-useless-checkboxes-on-referentials-index
5297_fix_referential_create_validation
5299-merge-operation
5305_autocomplete_stop_area_unaccent
5307_referential_lines_menu
5311-stop-area-type-customizable
5313_stop_areas_parent
5321-remove-duplicated-field-in-new-line-form
5325-use-policies-for-calendars-sharing
5331-display-users-name
5333-add-policies-for-referentials-sharing
5334-add-nulldb-support
5336-spurious-buttons
5339-organisation-and-features
5340-deactivate-lines
5341-create-referential-vehiclejourneys-controller
5348_clickable_brandname
5349-deactivate-stop-areas
5351-stop-area-waiting-time
5355-add-button-to-opposite-itinerary-timetable
5358-fix-undefined-in-header
5361-make-company-optional-on-lines
5367-add-color-input
5372-clean-referential-after-cloning
5372-clean-with-metadata-2
5376-fix-vehicle-journeys-ui
5382-all-stop-types-in-routes
5392-add-beradcrumb-on-referential-form
5407-add-purchase-windows-to-vehicle-journeys
5409-add_purchase_window_to_date_filters
5413-read_only_policy_for_finalised_refs
5416_checksum_attribute--original
5416_checksum_attribute--rb201802071702
5417-checksum-relationships
5426-refactor-sticky-actions
5427_stop_area_country_select
5433-show-journeys-name-in-editor
5435-fix-journey-edition-from-editor
5436-keep-stops-order-on-routes-cloning
5444-add-company-filter-on-journeys-index
5444-add-company-filter-on-referentialjourneys-index
5445-add-name-filter-on-journeys-index
5445-add-name-filter-on-referentialjourneys-index
5448-fix-objectid-filters
5454-revert-cancel-button-on-journeys-editor
5455-store-costs-between-stops
5460_display_checksum
5465-dezoom-routes-show
5466-fix-title-overflow-in-stick-header
5485-first-docker-scripts
5486-fix-react-warnings
5493-use-tz-for-time-display
5499-workgroup-model
5502-remove-search-from-selects
5505-custom_fields
5505-custom_fields_with_jsonb
5506-testdb_migration_after_rollback
5519-single-day-purchse-windows
5520-fix-company-in-vjs-editor
5529-prevent-double-submitting-of-react-forms
5535-compute-vehicle-journeys-times
5547-show-vj-id
5549_networks_policy
5551-handle-custom-fields-in-vjs-editor
5556-total-time-on-j-editor
5557-fix-calendar-creation
5560-add-validation-on-customfields
5563-show-parent-stop-type
5567-routes-map-on-line-show
5568-fix-vjs-editor
5571-remove-pagination-on-referential-vjs-index
5574-vehicle-journeys--fix-transporter-deletion-in-modal--rb
5576-vehicle-journeys--filter-by-line
5585_stop_area_waiting_time
5586-refactor-action-links
5592-workbenches-show--filter-by-workgroup-on-initial-load
5593-task-to-update-checksum
5598-fix-journey-patterns-collection
5609_referential_slug
5609_slug_format
5610_vehicle_journey_published_journey_name
5614-fix-schedule-computation
5623-fix-schedule-when-jp-is-prefilled
5642-insee-code
5647-scope-custom-fields-validations
5669-specs-snpashots
5670-user-registration-i18n
5682-add-days-to-calendars
5683-add_workgroup_id_to_calendars
5709_fix_ccset_sorting
5717-fix-periods-on-timetables
5718-show-times-in-vehiclejourneys-index
5750-non-commercial-stop-areas
5754-filter-journeys-on-calendar
5758-localized-stop-areas-names
5762-stoparea-coordinates-are-optional
5763-fix-referentials-list
5764-add-checksum-to-purchase-windows
5765-customizable-importer
5796-fix-vjs-index
'use strict'
;
var
directive
=
{};
directive
.
dropdownToggle
=
[
'$document'
,
'$location'
,
'$window'
,
function
(
$document
,
$location
,
$window
)
{
var
openElement
=
null
,
close
;
return
{
restrict
:
'C'
,
link
:
function
(
scope
,
element
,
attrs
)
{
scope
.
$watch
(
function
dropdownTogglePathWatch
(){
return
$location
.
path
();},
function
dropdownTogglePathWatchAction
()
{
close
&&
close
();
});
element
.
parent
().
on
(
'click'
,
function
(
event
)
{
close
&&
close
();
});
element
.
on
(
'click'
,
function
(
event
)
{
event
.
preventDefault
();
event
.
stopPropagation
();
var
iWasOpen
=
false
;
if
(
openElement
)
{
iWasOpen
=
openElement
===
element
;
close
();
}
if
(
!
iWasOpen
){
element
.
parent
().
addClass
(
'open'
);
openElement
=
element
;
close
=
function
(
event
)
{
event
&&
event
.
preventDefault
();
event
&&
event
.
stopPropagation
();
$document
.
off
(
'click'
,
close
);
element
.
parent
().
removeClass
(
'open'
);
close
=
null
;
openElement
=
null
;
}
$document
.
on
(
'click'
,
close
);
}
});
}
};
}];
directive
.
syntax
=
function
()
{
return
{
restrict
:
'A'
,
link
:
function
(
scope
,
element
,
attrs
)
{
function
makeLink
(
type
,
text
,
link
,
icon
)
{
return
'<a href="'
+
link
+
'" class="btn syntax-'
+
type
+
'" target="_blank" rel="nofollow">'
+
'<span class="'
+
icon
+
'"></span> '
+
text
+
'</a>'
;
};
var
html
=
''
;
var
types
=
{
'github'
:
{
text
:
'View on Github'
,
key
:
'syntaxGithub'
,
icon
:
'icon-github'
},
'plunkr'
:
{
text
:
'View on Plunkr'
,
key
:
'syntaxPlunkr'
,
icon
:
'icon-arrow-down'
},
'jsfiddle'
:
{
text
:
'View on JSFiddle'
,
key
:
'syntaxFiddle'
,
icon
:
'icon-cloud'
}
};
for
(
var
type
in
types
)
{
var
data
=
types
[
type
];
var
link
=
attrs
[
data
.
key
];
if
(
link
)
{
html
+=
makeLink
(
type
,
data
.
text
,
link
,
data
.
icon
);
}
};
var
nav
=
document
.
createElement
(
'nav'
);
nav
.
className
=
'syntax-links'
;
nav
.
innerHTML
=
html
;
var
node
=
element
[
0
];
var
par
=
node
.
parentNode
;
par
.
insertBefore
(
nav
,
node
);
}
}
}
directive
.
tabbable
=
function
()
{
return
{
restrict
:
'C'
,
compile
:
function
(
element
)
{
var
navTabs
=
angular
.
element
(
'<ul class="nav nav-tabs"></ul>'
),
tabContent
=
angular
.
element
(
'<div class="tab-content"></div>'
);
tabContent
.
append
(
element
.
contents
());
element
.
append
(
navTabs
).
append
(
tabContent
);
},
controller
:
[
'$scope'
,
'$element'
,
function
(
$scope
,
$element
)
{
var
navTabs
=
$element
.
contents
().
eq
(
0
),
ngModel
=
$element
.
controller
(
'ngModel'
)
||
{},
tabs
=
[],
selectedTab
;
ngModel
.
$render
=
function
()
{
var
$viewValue
=
this
.
$viewValue
;
if
(
selectedTab
?
(
selectedTab
.
value
!=
$viewValue
)
:
$viewValue
)
{
if
(
selectedTab
)
{
selectedTab
.
paneElement
.
removeClass
(
'active'
);
selectedTab
.
tabElement
.
removeClass
(
'active'
);
selectedTab
=
null
;
}
if
(
$viewValue
)
{
for
(
var
i
=
0
,
ii
=
tabs
.
length
;
i
<
ii
;
i
++
)
{
if
(
$viewValue
==
tabs
[
i
].
value
)
{
selectedTab
=
tabs
[
i
];
break
;
}
}
if
(
selectedTab
)
{
selectedTab
.
paneElement
.
addClass
(
'active'
);
selectedTab
.
tabElement
.
addClass
(
'active'
);
}
}
}
};
this
.
addPane
=
function
(
element
,
attr
)
{
var
li
=
angular
.
element
(
'<li><a href></a></li>'
),
a
=
li
.
find
(
'a'
),
tab
=
{
paneElement
:
element
,
paneAttrs
:
attr
,
tabElement
:
li
};
tabs
.
push
(
tab
);
attr
.
$observe
(
'value'
,
update
)();
attr
.
$observe
(
'title'
,
function
(){
update
();
a
.
text
(
tab
.
title
);
})();
function
update
()
{
tab
.
title
=
attr
.
title
;
tab
.
value
=
attr
.
value
||
attr
.
title
;
if
(
!
ngModel
.
$setViewValue
&&
(
!
ngModel
.
$viewValue
||
tab
==
selectedTab
))
{
// we are not part of angular
ngModel
.
$viewValue
=
tab
.
value
;
}
ngModel
.
$render
();
}
navTabs
.
append
(
li
);
li
.
on
(
'click'
,
function
(
event
)
{
event
.
preventDefault
();
event
.
stopPropagation
();
if
(
ngModel
.
$setViewValue
)
{
$scope
.
$apply
(
function
()
{
ngModel
.
$setViewValue
(
tab
.
value
);
ngModel
.
$render
();
});
}
else
{
// we are not part of angular
ngModel
.
$viewValue
=
tab
.
value
;
ngModel
.
$render
();
}
});
return
function
()
{
tab
.
tabElement
.
remove
();
for
(
var
i
=
0
,
ii
=
tabs
.
length
;
i
<
ii
;
i
++
)
{
if
(
tab
==
tabs
[
i
])
{
tabs
.
splice
(
i
,
1
);
}
}
};
}
}]
};
};
directive
.
table
=
function
()
{
return
{
restrict
:
'E'
,
link
:
function
(
scope
,
element
,
attrs
)
{
element
[
0
].
className
=
'table table-bordered table-striped code-table'
;
}
};
};
var
popoverElement
=
function
()
{
var
object
=
{
init
:
function
()
{
this
.
element
=
angular
.
element
(
'<div class="popover popover-incode top">'
+
'<div class="arrow"></div>'
+
'<div class="popover-inner">'
+
'<div class="popover-title"><code></code></div>'
+
'<div class="popover-content"></div>'
+
'</div>'
+
'</div>'
);
this
.
node
=
this
.
element
[
0
];
this
.
element
.
css
({
'display'
:
'block'
,
'position'
:
'absolute'
});
angular
.
element
(
document
.
body
).
append
(
this
.
element
);
var
inner
=
this
.
element
.
children
()[
1
];
this
.
titleElement
=
angular
.
element
(
inner
.
childNodes
[
0
].
firstChild
);
this
.
contentElement
=
angular
.
element
(
inner
.
childNodes
[
1
]);
//stop the click on the tooltip
this
.
element
.
bind
(
'click'
,
function
(
event
)
{
event
.
preventDefault
();
event
.
stopPropagation
();
});
var
self
=
this
;
angular
.
element
(
document
.
body
).
bind
(
'click'
,
function
(
event
)
{
if
(
self
.
visible
())
self
.
hide
();
});
},
show
:
function
(
x
,
y
)
{
this
.
element
.
addClass
(
'visible'
);
this
.
position
(
x
||
0
,
y
||
0
);
},
hide
:
function
()
{
this
.
element
.
removeClass
(
'visible'
);
this
.
position
(
-
9999
,
-
9999
);
},
visible
:
function
()
{
return
this
.
position
().
y
>=
0
;
},
isSituatedAt
:
function
(
element
)
{
return
this
.
besideElement
?
element
[
0
]
==
this
.
besideElement
[
0
]
:
false
;
},
title
:
function
(
value
)
{
return
this
.
titleElement
.
html
(
value
);
},
content
:
function
(
value
)
{
if
(
value
&&
value
.
length
>
0
)
{
value
=
new
Showdown
.
converter
().
makeHtml
(
value
);
}
return
this
.
contentElement
.
html
(
value
);
},
positionArrow
:
function
(
position
)
{
this
.
node
.
className
=
'popover '
+
position
;
},
positionAway
:
function
()
{
this
.
besideElement
=
null
;
this
.
hide
();
},
positionBeside
:
function
(
element
)
{
this
.
besideElement
=
element
;
var
elm
=
element
[
0
];
var
x
=
elm
.
offsetLeft
;
var
y
=
elm
.
offsetTop
;
x
-=
30
;
y
-=
this
.
node
.
offsetHeight
+
10
;
this
.
show
(
x
,
y
);
},
position
:
function
(
x
,
y
)
{
if
(
x
!=
null
&&
y
!=
null
)
{
this
.
element
.
css
(
'left'
,
x
+
'px'
);
this
.
element
.
css
(
'top'
,
y
+
'px'
);
}
else
{
return
{
x
:
this
.
node
.
offsetLeft
,
y
:
this
.
node
.
offsetTop
};
}
}
};
object
.
init
();
object
.
hide
();
return
object
;
};
directive
.
popover
=
[
'popoverElement'
,
function
(
popover
)
{
return
{
restrict
:
'A'
,
priority
:
500
,
link
:
function
(
scope
,
element
,
attrs
)
{
element
.
bind
(
'click'
,
function
(
event
)
{
event
.
preventDefault
();
event
.
stopPropagation
();
if
(
popover
.
isSituatedAt
(
element
)
&&
popover
.
visible
())
{
popover
.
title
(
''
);
popover
.
content
(
''
);
popover
.
positionAway
();
}
else
{
popover
.
title
(
attrs
.
title
);
popover
.
content
(
attrs
.
content
);
popover
.
positionBeside
(
element
);
}
});
}
}
}];
directive
.
tabPane
=
function
()
{
return
{
require
:
'^tabbable'
,
restrict
:
'C'
,
link
:
function
(
scope
,
element
,
attrs
,
tabsCtrl
)
{
element
.
on
(
'$remove'
,
tabsCtrl
.
addPane
(
element
,
attrs
));
}
};
};
directive
.
foldout
=
[
'$http'
,
'$animator'
,
'$window'
,
function
(
$http
,
$animator
,
$window
)
{
return
{
restrict
:
'A'
,
priority
:
500
,
link
:
function
(
scope
,
element
,
attrs
)
{
var
animator
=
$animator
(
scope
,
{
ngAnimate
:
"'foldout'"
});
var
container
,
loading
,
url
=
attrs
.
url
;
if
(
/\/build\//
.
test
(
$window
.
location
.
href
))
{
url
=
'/build/docs'
+
url
;
}
element
.
bind
(
'click'
,
function
()
{
scope
.
$apply
(
function
()
{
if
(
!
container
)
{
if
(
loading
)
return
;
loading
=
true
;
var
par
=
element
.
parent
();
container
=
angular
.
element
(
'<div class="foldout">loading...</div>'
);
animator
.
enter
(
container
,
null
,
par
);
$http
.
get
(
url
,
{
cache
:
true
}).
success
(
function
(
html
)
{
loading
=
false
;
html
=
'<div class="foldout-inner">'
+
'<div calss="foldout-arrow"></div>'
+
html
+
'</div>'
;
container
.
html
(
html
);
//avoid showing the element if the user has already closed it
if
(
container
.
css
(
'display'
)
==
'block'
)
{
container
.
css
(
'display'
,
'none'
);
animator
.
show
(
container
);
}
});
}
else
{
container
.
css
(
'display'
)
==
'none'
?
animator
.
show
(
container
)
:
animator
.
hide
(
container
);
}
});
});
}
}
}];
angular
.
module
(
'bootstrap'
,
[]).
directive
(
directive
).
factory
(
'popoverElement'
,
popoverElement
);