diff --git a/src/main/resources/db/hsqldb/initDB.sql b/src/main/resources/db/hsqldb/initDB.sql index a16c42dec..51415879e 100644 --- a/src/main/resources/db/hsqldb/initDB.sql +++ b/src/main/resources/db/hsqldb/initDB.sql @@ -10,7 +10,8 @@ DROP TABLE owners IF EXISTS; CREATE TABLE vets ( id INTEGER IDENTITY PRIMARY KEY, first_name VARCHAR(30), - last_name VARCHAR(30) + last_name VARCHAR(30), + profile_pic BLOB ); CREATE INDEX vets_last_name ON vets (last_name); @@ -39,7 +40,8 @@ CREATE TABLE owners ( last_name VARCHAR(30), address VARCHAR(255), city VARCHAR(80), - telephone VARCHAR(20) + telephone VARCHAR(20), + profile_pic BLOB ); CREATE INDEX owners_last_name ON owners (last_name); @@ -48,7 +50,8 @@ CREATE TABLE pets ( name VARCHAR(30), birth_date DATE, type_id INTEGER NOT NULL, - owner_id INTEGER NOT NULL + owner_id INTEGER NOT NULL, + profile_pic BLOB ); ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); diff --git a/src/main/resources/db/hsqldb/populateDB.sql b/src/main/resources/db/hsqldb/populateDB.sql index 16dda3e84..624b642c1 100644 --- a/src/main/resources/db/hsqldb/populateDB.sql +++ b/src/main/resources/db/hsqldb/populateDB.sql @@ -1,9 +1,9 @@ -INSERT INTO vets VALUES (1, 'James', 'Carter'); -INSERT INTO vets VALUES (2, 'Helen', 'Leary'); -INSERT INTO vets VALUES (3, 'Linda', 'Douglas'); -INSERT INTO vets VALUES (4, 'Rafael', 'Ortega'); -INSERT INTO vets VALUES (5, 'Henry', 'Stevens'); -INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins'); +INSERT INTO vets VALUES (1, 'James', 'Carter', NULL); +INSERT INTO vets VALUES (2, 'Helen', 'Leary', NULL); +INSERT INTO vets VALUES (3, 'Linda', 'Douglas', NULL); +INSERT INTO vets VALUES (4, 'Rafael', 'Ortega', NULL); +INSERT INTO vets VALUES (5, 'Henry', 'Stevens', NULL); +INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins', NULL); INSERT INTO specialties VALUES (1, 'radiology'); INSERT INTO specialties VALUES (2, 'surgery'); @@ -22,30 +22,30 @@ INSERT INTO types VALUES (4, 'snake'); INSERT INTO types VALUES (5, 'bird'); INSERT INTO types VALUES (6, 'hamster'); -INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); -INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); -INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); -INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); -INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); -INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); -INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); -INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); -INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); -INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); +INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023', NULL); +INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749', NULL); +INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763', NULL); +INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198', NULL); +INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765', NULL); +INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654', NULL); +INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387', NULL); +INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683', NULL); +INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435', NULL); +INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487', NULL); -INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1); -INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2); -INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3); -INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3); -INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4); -INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5); -INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6); -INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6); -INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7); -INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8); -INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9); -INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10); -INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10); +INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1, NULL); +INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2, NULL); +INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3, NULL); +INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3, NULL); +INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4, NULL); +INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5, NULL); +INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6, NULL); +INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6, NULL); +INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7, NULL); +INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8, NULL); +INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9, NULL); +INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10, NULL); +INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10, NULL); INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot'); INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot'); diff --git a/assets/files/images/service1.jpg b/src/main/resources/db/images/service1.jpg similarity index 100% rename from assets/files/images/service1.jpg rename to src/main/resources/db/images/service1.jpg diff --git a/assets/files/images/service2.jpg b/src/main/resources/db/images/service2.jpg similarity index 100% rename from assets/files/images/service2.jpg rename to src/main/resources/db/images/service2.jpg diff --git a/assets/files/images/service3.jpg b/src/main/resources/db/images/service3.jpg similarity index 100% rename from assets/files/images/service3.jpg rename to src/main/resources/db/images/service3.jpg diff --git a/assets/files/images/service4.jpg b/src/main/resources/db/images/service4.jpg similarity index 100% rename from assets/files/images/service4.jpg rename to src/main/resources/db/images/service4.jpg diff --git a/assets/files/images/vet1.jpg b/src/main/resources/db/images/vet1.jpg similarity index 100% rename from assets/files/images/vet1.jpg rename to src/main/resources/db/images/vet1.jpg diff --git a/assets/files/images/vet2.jpg b/src/main/resources/db/images/vet2.jpg similarity index 100% rename from assets/files/images/vet2.jpg rename to src/main/resources/db/images/vet2.jpg diff --git a/assets/files/images/vet3.jpg b/src/main/resources/db/images/vet3.jpg similarity index 100% rename from assets/files/images/vet3.jpg rename to src/main/resources/db/images/vet3.jpg diff --git a/assets/files/images/vet4.jpg b/src/main/resources/db/images/vet4.jpg similarity index 100% rename from assets/files/images/vet4.jpg rename to src/main/resources/db/images/vet4.jpg diff --git a/src/main/resources/spring/mvc-core-config.xml b/src/main/resources/spring/mvc-core-config.xml index 8f661a167..62d86c010 100644 --- a/src/main/resources/spring/mvc-core-config.xml +++ b/src/main/resources/spring/mvc-core-config.xml @@ -43,13 +43,6 @@ - - - - - - - + - - - - - - - - - + + + + + + - - - - - - - @@ -51,5 +41,5 @@ - s + diff --git a/src/main/webapp/components/veterinarians/veterinarians.html b/src/main/webapp/components/veterinarians/veterinarians.html index 3cbe95289..57e51a301 100644 --- a/src/main/webapp/components/veterinarians/veterinarians.html +++ b/src/main/webapp/components/veterinarians/veterinarians.html @@ -10,65 +10,16 @@
-
-
- Generic placeholder image -
-

Thumbnail label

-

Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts.

-
-
-
-
+
Generic placeholder image
-

Thumbnail label

+

Veterinarian Name

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

-
-
- Generic placeholder image -
-

Thumbnail label

-

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

-
-
-
- -
-
-
- Generic placeholder image -
-

Thumbnail label

-

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

-
-
-
-
-
- Generic placeholder image -
-

Thumbnail label

-

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

-
-
-
-
-
- Generic placeholder image -
-

Thumbnail label

-

The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli.

-
-
-
-
-

View More ยป

diff --git a/src/main/webapp/js/lib/bootstrap.js b/src/main/webapp/js/lib/bootstrap.js old mode 100644 new mode 100755 index 53da1c77c..43274468b --- a/src/main/webapp/js/lib/bootstrap.js +++ b/src/main/webapp/js/lib/bootstrap.js @@ -1,76 +1,29 @@ /*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. + * Bootstrap v3.3.2 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.2.0 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - +/*! + * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=3737c006931bd9891dc3) + * Config saved to config.json and https://gist.github.com/3737c006931bd9891dc3 + */ +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} +function ($) { 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher') } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - }(jQuery); /* ======================================================================== - * Bootstrap: alert.js v3.2.0 + * Bootstrap: alert.js v3.3.2 * http://getbootstrap.com/javascript/#alerts * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. + * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -86,7 +39,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $(el).on('click', dismiss, this.close) } - Alert.VERSION = '3.2.0' + Alert.VERSION = '3.3.2' + + Alert.TRANSITION_DURATION = 150 Alert.prototype.close = function (e) { var $this = $(this) @@ -102,7 +57,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (e) e.preventDefault() if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() + $parent = $this.closest('.alert') } $parent.trigger(e = $.Event('close.bs.alert')) @@ -119,7 +74,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $.support.transition && $parent.hasClass('fade') ? $parent .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(150) : + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : removeElement() } @@ -160,10 +115,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re }(jQuery); /* ======================================================================== - * Bootstrap: button.js v3.2.0 + * Bootstrap: button.js v3.3.2 * http://getbootstrap.com/javascript/#buttons * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. + * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -180,7 +135,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.isLoading = false } - Button.VERSION = '3.2.0' + Button.VERSION = '3.3.2' Button.DEFAULTS = { loadingText: 'loading...' @@ -196,10 +151,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (data.resetText == null) $el.data('resetText', $el[val]()) - $el[val](data[state] == null ? this.options[state] : data[state]) - // push to event loop to allow forms to submit setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + if (state == 'loadingText') { this.isLoading = true $el.addClass(d).attr(d, d) @@ -221,6 +176,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re else $parent.find('.active').removeClass('active') } if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) } if (changed) this.$element.toggleClass('active') @@ -261,20 +218,24 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // BUTTON DATA-API // =============== - $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - e.preventDefault() - }) + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + Plugin.call($btn, 'toggle') + e.preventDefault() + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) }(jQuery); /* ======================================================================== - * Bootstrap: carousel.js v3.2.0 + * Bootstrap: carousel.js v3.3.2 * http://getbootstrap.com/javascript/#carousel * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. + * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -286,7 +247,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // ========================= var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) + this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = @@ -295,20 +256,26 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.$active = this.$items = null - this.options.pause == 'hover' && this.$element + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) } - Carousel.VERSION = '3.2.0' + Carousel.VERSION = '3.3.2' + + Carousel.TRANSITION_DURATION = 600 Carousel.DEFAULTS = { interval: 5000, pause: 'hover', - wrap: true + wrap: true, + keyboard: true } Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return switch (e.which) { case 37: this.prev(); break case 39: this.next(); break @@ -335,6 +302,16 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re return this.$items.index(item || this.$active) } + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) @@ -344,7 +321,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" if (activeIndex == pos) return this.pause().cycle() - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) } Carousel.prototype.pause = function (e) { @@ -372,17 +349,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') - var $next = next || $active[type]() + var $next = next || this.getItemForDirection(type, $active) var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' var that = this - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - if ($next.hasClass('active')) return (this.sliding = false) var relatedTarget = $next[0] @@ -418,7 +389,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re that.$element.trigger(slidEvent) }, 0) }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) } else { $active.removeClass('active') $next.addClass('active') @@ -467,7 +438,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re // CAROUSEL DATA-API // ================= - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var clickHandler = function (e) { var href var $this = $(this) var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 @@ -483,7 +454,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re } e.preventDefault() - }) + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { @@ -495,181 +470,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re }(jQuery); /* ======================================================================== - * Bootstrap: collapse.js v3.2.0 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.2.0' - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - Plugin.call(actives, 'hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var href - var $this = $(this) - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.2.0 + * Bootstrap: dropdown.js v3.3.2 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. + * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -686,7 +490,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $(element).on('click.bs.dropdown', this.toggle) } - Dropdown.VERSION = '3.2.0' + Dropdown.VERSION = '3.3.2' Dropdown.prototype.toggle = function (e) { var $this = $(this) @@ -709,7 +513,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (e.isDefaultPrevented()) return - $this.trigger('focus') + $this + .trigger('focus') + .attr('aria-expanded', 'true') $parent .toggleClass('open') @@ -720,7 +526,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re } Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return var $this = $(this) @@ -732,7 +538,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var $parent = getParent($this) var isActive = $parent.hasClass('open') - if (!isActive || (isActive && e.keyCode == 27)) { + if ((!isActive && e.which != 27) || (isActive && e.which == 27)) { if (e.which == 27) $parent.find(toggle).trigger('focus') return $this.trigger('click') } @@ -742,10 +548,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (!$items.length) return - var index = $items.index($items.filter(':focus')) + var index = $items.index(e.target) - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down if (!~index) index = 0 $items.eq(index).trigger('focus') @@ -755,11 +561,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re if (e && e.which === 3) return $(backdrop).remove() $(toggle).each(function () { - var $parent = getParent($(this)) + var $this = $(this) + var $parent = getParent($this) var relatedTarget = { relatedTarget: this } + if (!$parent.hasClass('open')) return + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) }) } @@ -813,15 +625,17 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re .on('click.bs.dropdown.data-api', clearMenus) .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="menu"]', Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '[role="listbox"]', Dropdown.prototype.keydown) }(jQuery); /* ======================================================================== - * Bootstrap: modal.js v3.2.0 + * Bootstrap: modal.js v3.3.2 * http://getbootstrap.com/javascript/#modals * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. + * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * ======================================================================== */ @@ -849,7 +663,10 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re } } - Modal.VERSION = '3.2.0' + Modal.VERSION = '3.3.2' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 Modal.DEFAULTS = { backdrop: true, @@ -872,10 +689,11 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.isShown = true this.checkScrollbar() + this.setScrollbar() this.$body.addClass('modal-open') - this.setScrollbar() this.escape() + this.resize() this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) @@ -890,6 +708,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re .show() .scrollTop(0) + if (that.options.backdrop) that.adjustBackdrop() + that.adjustDialog() + if (transition) { that.$element[0].offsetWidth // force reflow } @@ -907,7 +728,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re .one('bsTransitionEnd', function () { that.$element.trigger('focus').trigger(e) }) - .emulateTransitionEnd(300) : + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : that.$element.trigger('focus').trigger(e) }) } @@ -923,10 +744,8 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re this.isShown = false - this.$body.removeClass('modal-open') - - this.resetScrollbar() this.escape() + this.resize() $(document).off('focusin.bs.modal') @@ -938,7 +757,7 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re $.support.transition && this.$element.hasClass('fade') ? this.$element .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : this.hideModal() } @@ -954,11 +773,19 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re Modal.prototype.escape = function () { if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { e.which == 27 && this.hide() }, this)) } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') } } @@ -966,6 +793,9 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var that = this this.$element.hide() this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() that.$element.trigger('hidden.bs.modal') }) } @@ -983,14 +813,13 @@ if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript re var doAnimate = $.support.transition && animate this.$backdrop = $(' + + + +
+
+
+
+ +
+
+

Welcome, John Doe

+

When youโ€™re ready, you may start adding a new pet owner or continue browsing.

+
+
+
+
+ + +
+
+

Browse Owners

+
+
+
+ Generic placeholder image +
+

Eduardo Rodriguez

+

2693 Commerce St., McFarland

+

+6085558763

+
+
+
    +
  • + Generic placeholder image +
  • +
  • + +
  • +
+
+
+
+
+
+ Generic placeholder image +
+

Eduardo Rodriguez

+

2693 Commerce St., McFarland

+

+6085558763

+
+
+
    +
  • + Generic placeholder image +
  • +
  • + +
  • +
+
+
+
+
+
+ Generic placeholder image +
+

Eduardo Rodriguez

+

2693 Commerce St., McFarland

+

+6085558763

+
+
+
    +
  • + Generic placeholder image +
  • +
  • + +
  • +
+
+
+
+
+
+ Generic placeholder image +
+

Eduardo Rodriguez

+

2693 Commerce St., McFarland

+

+6085558763

+
+
+
    +
  • + Generic placeholder image +
  • +
  • + +
  • +
+
+
+
+
+ +
+ +
+
+
+ + +
+
+

Pets

+
+
+
+ Generic placeholder image +
+

Basil

+

08 August 2012

+

Hamster

+
+
+
+
+
+ Generic placeholder image +
+

Basil

+

08 August 2012

+

Hamster

+
+
+
+
+
+ Generic placeholder image +
+

Basil

+

08 August 2012

+

Hamster

+
+
+
+
+
+ Generic placeholder image +
+

Basil

+

08 August 2012

+

Hamster

+
+
+
+
+ +
+ +
+
+
+ + +
+
+

Veterinarians

+
+
+
+ Generic placeholder image +
+

Helen Leary

+

+6085558763

+

Surgery

+
+
+
+
+
+ Generic placeholder image +
+

Helen Leary

+

+6085558763

+

Surgery

+
+
+
+
+
+ Generic placeholder image +
+

Helen Leary

+

+6085558763

+

Surgery

+
+
+
+
+
+ Generic placeholder image +
+

Helen Leary

+

+6085558763

+

Surgery

+
+
+
+
+ + +
+
+ + +
+
+

Tell your friends: Facebook, Twitter, Google+

+

ยฉ 2015 Pet Clinic, A Spring Framework Demonstration

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/app/discover.html b/src/main/webapp/static/app/discover.html new file mode 100644 index 000000000..86fb437ec --- /dev/null +++ b/src/main/webapp/static/app/discover.html @@ -0,0 +1,260 @@ + + + + + Pet Clinic - Discover Pet Owners on your Neigborhood + + + + + + + + + + + + + + + + + + +
+
+
+
+

Discover Pet Owners

+

Helping you discover pet owners near you and connect.

+
+
+ +
+
+ +
+
+
+
+
+
+ + +
+
+ + +
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

+
+
+
+
+ + +
+
+ + +
+
+
+
+

Over 40,000 pet owners trust us. Register now. It's Free forever!

+

Use it as a starting point to create something more unique.

+
+
+ + +
+ + +
+
+ + +
+ +
+
+
+
+
+ + +
+
+ +
+
+

Business Hours

+

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

+
+
+

Our Location

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

+
+
+

Questions or comments

+

Cras mattis consectetur purus sit amet fermentum.

+

+ Drop us a line +

+
+
+
+
+ + +
+
+

Tell your friends: Facebook, Twitter, Google+

+

ยฉ 2015 Pet Clinic, A Spring Framework Demonstration

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/app/favicon.ico b/src/main/webapp/static/app/favicon.ico new file mode 100644 index 000000000..04c64a9d8 Binary files /dev/null and b/src/main/webapp/static/app/favicon.ico differ diff --git a/src/main/webapp/static/app/images/avatar.jpg b/src/main/webapp/static/app/images/avatar.jpg new file mode 100644 index 000000000..053ba2d28 Binary files /dev/null and b/src/main/webapp/static/app/images/avatar.jpg differ diff --git a/src/main/webapp/static/app/images/logo.png b/src/main/webapp/static/app/images/logo.png new file mode 100644 index 000000000..b05277ef6 Binary files /dev/null and b/src/main/webapp/static/app/images/logo.png differ diff --git a/src/main/webapp/static/app/images/owner-default.png b/src/main/webapp/static/app/images/owner-default.png new file mode 100644 index 000000000..51db28cdf Binary files /dev/null and b/src/main/webapp/static/app/images/owner-default.png differ diff --git a/src/main/webapp/static/app/images/pet-default.png b/src/main/webapp/static/app/images/pet-default.png new file mode 100644 index 000000000..8e6f7c2df Binary files /dev/null and b/src/main/webapp/static/app/images/pet-default.png differ diff --git a/src/main/webapp/static/app/images/pet-small.png b/src/main/webapp/static/app/images/pet-small.png new file mode 100644 index 000000000..df3f275f0 Binary files /dev/null and b/src/main/webapp/static/app/images/pet-small.png differ diff --git a/src/main/webapp/static/app/images/veterinarian-default.jpg b/src/main/webapp/static/app/images/veterinarian-default.jpg new file mode 100644 index 000000000..fdf962529 Binary files /dev/null and b/src/main/webapp/static/app/images/veterinarian-default.jpg differ diff --git a/src/main/webapp/static/app/index.html b/src/main/webapp/static/app/index.html new file mode 100644 index 000000000..16f0d7955 --- /dev/null +++ b/src/main/webapp/static/app/index.html @@ -0,0 +1,336 @@ + + + + + Pet Clinic + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+

Pet care for the People who love them

+

PetClinic is here to enhance people's relationships with their pets

+

Learn more

+
+
+
+ +
+ + +
+
+
+
+
+

Our Veterinarians

+

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

+
+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

+
+
+
+
+ +
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

+
+
+
+
+
+ Generic placeholder image +
+

Thumbnail label

+

The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli.

+
+
+
+
+ + +
+
+ + +
+
+
+
+ Generic placeholder image +
+
+

Services One

+

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

+

+ Learn more ยป +

+
+
+
+
+ + +
+
+
+
+

Services Two

+

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

+

+ Learn more ยป +

+
+
+ Generic placeholder image +
+
+
+
+ + +
+
+
+
+ Generic placeholder image +
+
+

Services Three

+

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

+

+ Learn more ยป +

+
+
+
+
+ + +
+
+
+
+
+

What our customers are saying.

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.

+
+
+
+
+
+ Generic placeholder image +

Client One

+

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

+
+
+ Generic placeholder image +

Client Two

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

+
+
+ Generic placeholder image +

Client Three

+

Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+
+
+ +
+
+ + +
+
+
+
+
+

Trusted by some of the world's smartest companies

+
+
+
+
+
+ Companies placeholder image +
+
+ Companies placeholder image +
+
+ Companies placeholder image +
+
+ Companies placeholder image +
+
+ Companies placeholder image +
+
+ Companies placeholder image +
+
+
+
+ + +
+
+
+
+

Over 40,000 pet owners trust us.

+

Use it as a starting point to create something more unique.

+
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ + + + +
+
+ +
+
+

Business Hours

+

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

+
+
+

Our Location

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

+
+
+

Questions or comments

+

Cras mattis consectetur purus sit amet fermentum.

+

+ Drop us a line +

+
+
+
+ +
+

Tell your friends: Facebook, Twitter, Google+

+

ยฉ 2015 Pet Clinic, A Spring Framework Demonstration

+
+
+ + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/app/robots.txt b/src/main/webapp/static/app/robots.txt new file mode 100644 index 000000000..ee2cc216a --- /dev/null +++ b/src/main/webapp/static/app/robots.txt @@ -0,0 +1,3 @@ +# robotstxt.org/ + +User-agent: * diff --git a/src/main/webapp/static/app/scripts/main.js b/src/main/webapp/static/app/scripts/main.js new file mode 100644 index 000000000..158d65722 --- /dev/null +++ b/src/main/webapp/static/app/scripts/main.js @@ -0,0 +1,19 @@ +'use strict'; + +// Scroll Nav +function scrollNav() { + $('.js-scroll-nav').click(function() { + //Animate + $('html, body').stop().animate({ + scrollTop: $($(this).attr('href')).offset().top - 20 + }, 1000); + return false; + }); +} + +// On Dom Ready +$(function() { + + scrollNav(); + +}); diff --git a/src/main/webapp/static/app/show.html b/src/main/webapp/static/app/show.html new file mode 100644 index 000000000..e5b14e57c --- /dev/null +++ b/src/main/webapp/static/app/show.html @@ -0,0 +1,229 @@ + + + + + Pet Clinic - Discover Pet Owners on your Neigborhood + + + + + + + + + + + + + + + + + + +
+
+
+
+

John Doe

+

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

+
+ +
+
+
+ + +
+
+
+
+
+
+ + Owner Information + +
+
+ +
+ + +
+
+
+ +
+ +
+ +
+
+
+
+ + +
+ +
+ +
+
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+
+
+ + +
+ +
+ +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+
+
+ + +
+ +
+ + +
+
+ +
+
+

Business Hours

+

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

+
+
+

Our Location

+

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

+
+
+

Questions or comments

+

Cras mattis consectetur purus sit amet fermentum.

+

+ Drop us a line +

+
+
+
+
+ + +
+
+

Tell your friends: Facebook, Twitter, Google+

+

ยฉ 2015 Pet Clinic, A Spring Framework Demonstration

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/app/styles/main.scss b/src/main/webapp/static/app/styles/main.scss new file mode 100644 index 000000000..f43acfd8b --- /dev/null +++ b/src/main/webapp/static/app/styles/main.scss @@ -0,0 +1,654 @@ +$icon-font-path: "../bower_components/bootstrap-sass-official/assets/fonts/bootstrap/"; +$brand-primary: #6cb947; +$text-color: #747c83; +$text-color-inverse: #fff; +$headings-color: #555f64; +$sections-bg: #f0f2f5; +$sections-border: #e7e9eb; +$jumbotron-bg: #42494d; +$navbar-default-bg: #2d4f61; +$navbar-default-border: #2d4f61; +$navbar-default-link-color: #749aa4; +$navbar-default-link-hover-color: #d9e9ed; +$navbar-default-link-active-color: #e6f2f5; +$thumbnail-border: #e6e9ed; +$btn-default-color: #495256; +$btn-default-border: #D4D5D7; + +%font-smoothing { + -webkit-font-smoothing: antialiased; +} + +// bower:scss +@import "bootstrap-sass-official/assets/stylesheets/_bootstrap.scss"; +// endbower + +.browsehappy { + margin: 0.2em 0; + background: #ccc; + color: #000; + padding: 0.2em 0; +} + +/* Space out content a bit */ +body { + @extend %font-smoothing; +} + +/* Everything but the jumbotron gets side spacing for mobile first views */ +.header, +.marketing, +.footer { + padding-left: 15px; + padding-right: 15px; +} + +/* Custom page header */ +.header { + border-bottom: 1px solid #e5e5e5; + + /* Make the masthead heading the same height as the navigation */ + h3 { + margin-top: 0; + margin-bottom: 0; + line-height: 40px; + padding-bottom: 19px; + } +} + +/* Header */ +.sub-header { + font-size: 26px; + font-weight: 500; + margin-top: 10px; + padding-bottom: 10px; +} + +.container-narrow > hr { + margin: 30px 0; +} + +/* Main marketing message and sign up button */ +.jumbotron { + background-color: $jumbotron-bg; + height: 580px; + margin-bottom: 0; + text-align: center; + border-bottom: 1px solid #e5e5e5; + position: relative; + overflow: hidden; + + .container { + height: 100%; + position: relative; + z-index: 3; + } +} + +.jumbotron-auto { + height: auto; +} + +.jumbotron-headline { + display: table; + height: 100%; + width: 100%; + + + h1, .h1 { + color: $text-color-inverse; + font-size: 48px; + font-weight: 500; + margin-bottom: 15px; + } + + p { + color: $text-color-inverse; + font-size: 23px; + font-weight: 500; + margin-bottom: 30px; + } +} + +.jumbotron-headline-cell { + display: table-cell; + vertical-align: middle; +} + +/* Secondary marketing message and call to action */ +.jumbotron-secondary { + height: 500px; + + h2 { + color: $text-color-inverse; + font-size: 36px; + font-weight: 600; + margin-bottom: 15px; + + strong { + font-weight: 600; + } + } + + @media (max-width: $screen-md-min) { + height: auto; + } +} + +.jumbotron-appointment { + .form-inline { + font-size: 0; + } + + .form-group { + margin-right: 8px; + } + + .form-control { + height: 54px; + } + + .btn-primary { + padding: 15px 25px; + } + + @media (max-width: $grid-float-breakpoint) { + .form-group { + margin-right: 0; + } + + .btn-primary { + display: block; + margin-bottom: 20px; + width: 100%; + } + } +} + +/* Tertiary marketing message and call to action. */ +.jumbotron-tertiary { + height: 400px; + + h1, .h1 { + margin-top: 0; + } +} + +.jumbotron-video { + position: absolute; + opacity: .85; + left: 0; + top: 0px; + z-index: 1; + height: auto; + width: 100%; +} + +.jumbotron-welcome { + background-color: $text-color-inverse; +} + +@media (max-width: $screen-md-min) { + .jumbotron-video { + width: auto; + height: 100%; + } +} + +/* Sections */ +.sections { + background-color: $sections-bg; + border-bottom: 1px solid $sections-border; + padding: 100px 0; + + .thumbnail { + margin-bottom: 25px; + } +} + +.sections-narrow { + padding: 40px 0; +} + +.sections-browse { + background-color: $jumbotron-bg; + padding: 20px 0; +} + +.sections-light { + background-color: $text-color-inverse; +} + +.section-heading { + font-size: 40px; +} + +.section-heading-alt { + font-size: +} + +.section-desc { + font-size: 18px; + margin-bottom: 25px; +} + +.navbar { + height: 60px; +} + +.navbar-static-top { + margin-bottom: 0; +} + +.navbar-brand { + padding: 15px; + height: 60px; + line-height: normal; +} + +.navbar-nav { + > li { + > a { + padding-top: 20px; + padding-bottom: 20px; + } + } +} + +.navbar-form { + .form-group { + margin-bottom: 0; + } +} + +.nav-tabs-filter { + margin-bottom: 30px; +} + +.navbar-default { + .navbar-menu { + > li { + padding: 0 6px; + + @media (min-width: $grid-float-breakpoint) { + > a { + font-weight: 500; + padding: 20px 15px; + } + } + + &:hover { + > a { + background-color: transparent; + } + } + + &.active { + > a { + background-color: transparent; + font-weight: bold; + + &:hover { + background-color: transparent; + } + } + } + } + } + + @media (max-width: $grid-float-breakpoint) { + .navbar-menu { + background-color: darken($navbar-default-bg,10%); + + > li { + padding: 0; + + > a { + padding-top: 12px; + padding-bottom: 12px; + } + + &:hover { + > a { + background-color: transparent; + color: $navbar-default-link-hover-color; + } + } + } + } + } +} + +.navbar-profile { + @extend .pull-right; + + > li { + float:left; + margin-left: 15px; + margin-top: 15px; + + > a { + color: $navbar-default-link-color; + line-height: 30px; + height: 30px; + padding: 0; + text-align: center; + width: 30px; + + &:hover, + &:focus, + &:active { + background-color: transparent; + } + + &.img-profile { + background-color: transparent; + border: 0; + line-height: 0; + } + } + + .glyphicon-plus { + color: $navbar-default-link-color; + margin-left: 1px; + } + } + + .open { + > a, + > a:focus { + background-color: transparent; + } + } + + @media (max-width: $grid-float-breakpoint) { + position: absolute; + top: 0; + right: 0; + + > li { + &:last-child { + margin-right: 15px; + } + } + } + +} + +.navbar-dropdown-menu { + right: 0; + left: auto; + + &:after { + border-bottom: 10px solid; + border-right: 10px solid rgba($gray-darker, 0); + border-left: 10px solid rgba($gray-darker, 0); + color: darken($navbar-default-bg,10%); + content: ''; + display: block; + height: 0; + margin-left: 2px; + position: absolute; + top: -10px; + right: 10px; + vertical-align: middle; + width: 0; + } + + > li { + > a { + color: $navbar-default-link-color; + padding: 12px 15px; + + &:hover { + color: $navbar-default-link-hover-color; + background-color: rgba($gray-darker, 0); + } + } + } + + .divider { + background-color: rgba($navbar-default-link-color, .15); + margin: 0; + } +} + +.open > .navbar-dropdown-menu { + background-color: darken($navbar-default-bg,10%); + display: block; + width: 200px; + border: 0; + border-radius: 0; + box-shadow: none; + padding: 0; + top: 43px; + right: -5px; + + @media (max-width: $grid-float-breakpoint) { + position: fixed; + width: 100%; + left: 0; + top: 58px; + + &:after { + right: 20px; + } + } +} + +.navbar-collapse { + border-top: 0; +} + +.navbar-links { + > li { + display: inline-block; + + > a { + color: #303030; + font-weight: bold; + padding: 19px 15px; + + &:hover { + background-color: transparent; + color: $brand-primary; + } + } + } +} + +/* Show page */ +.show-hero { + background-color: $jumbotron-bg; + padding-top: 60px; + padding-bottom: 60px; + font-size: 24px; + text-align: left; + + h1 { + margin-top: 0; + } +} + +.form-control { + border: 1px solid $text-color-inverse; + border-radius: 3px; + box-shadow: none; +} + +.form-control-group { + padding-top: $padding-large-vertical; +} + +.btn { + border-color: transparent; + border-radius: 3px; + font-weight: 500; + transition: .3s ease-in-out; + + &:hover { + border-color: transparent; + } + + &:active, + &:focus { + border-color: rgba($gray-darker, 0.3); + outline: none 0; + box-shadow: inset 0 0 200px rgba($gray-darker, 0.3); + } +} + +.btn-default { + border-color: $btn-default-border; + + &:hover { + background-color: $btn-default-bg; + border-color: darken($btn-default-border,15%); + color: darken($btn-default-color,15%); + } +} + +.btn-lg { + font-weight: 500; +} + +/* Responsive: Portrait tablets and up */ +@media (max-width: 768px) { + + .navbar-brand { + padding-right: 0; + } + + .navbar-nav { + margin-bottom: 0; + margin-top: 0; + + > li { + > a { + padding-top: 10px; + padding-bottom: 10px; + } + } + } + + .navbar-form { + margin-top: 0; + margin-bottom: 0; + border-top: 0; + border-bottom: 0; + } + + // Default navbar + .navbar-default { + .navbar-toggle-left { + color: $navbar-default-link-color; + border: 0; + float: left; + margin: 15px 0 0 5px; + padding: 5px 8px 5px 8px; + + &:hover, + &:focus, + &:active { + color: $navbar-default-link-hover-color; + background-color: transparent; + } + } + } +} + +/* Media Object */ +.media-welcome { + .media-left { + padding-right: 20px; + } +} + +/* Mixin and adjust the regular image class */ +.thumbnail { + background-color: $thumbnail-bg; + border: 1px solid $thumbnail-border; + box-shadow: 0 1px 1px rgba($gray-base, 0.03); + padding: 0; + + > img { + margin-top: 40px; + } + + .caption { + padding: 20px; + text-align: center; + } + + .caption-heading { + color: darken($headings-color,5%); + font-size: 18px; + margin-bottom: 15px; + } + + .caption-meta { + color: #98a4b0; + font-size: 13px; + margin-bottom: 5px; + } + + .caption-label { + @extend .label; + @extend .label-default; + background-color: #98a4b0; + } + + .action-bar { + border-top: 1px solid $sections-border; + padding: 20px; + @extend .clearfix; + + ul { + list-style-type: none; + margin-bottom: 0; + margin-left: -10px; + padding-left: 0; + + li { + float: left; + margin-left: 10px; + } + } + } + + .action-add { + border: 1px dotted + } + + .btn-add-pet { + display: inline-block; + height: 30px; + width: 30px; + border: 1px dashed #AAA; + border-radius: 100%; + position: relative; + + .glyphicon { + color: #C3C6CA; + margin: 5px 0 0 8px; + } + } + + +} + +.thumbnail-wrapper { + margin-bottom: 20px; +} + +/* Custom page footer */ +.footer { + font-size: 13px; + padding: 30px 0; +} + +.colophon { + border-top: 1px solid $sections-border; + margin-top: 30px; + padding-top: 30px; +} diff --git a/src/main/webapp/static/app/videos/hero-bird.mp4 b/src/main/webapp/static/app/videos/hero-bird.mp4 new file mode 100644 index 000000000..e0dcdfc95 Binary files /dev/null and b/src/main/webapp/static/app/videos/hero-bird.mp4 differ diff --git a/src/main/webapp/static/bower.json b/src/main/webapp/static/bower.json new file mode 100644 index 000000000..7bd66ed56 --- /dev/null +++ b/src/main/webapp/static/bower.json @@ -0,0 +1,7 @@ +{ + "name": "petclinic", + "private": true, + "dependencies": { + "bootstrap-sass-official": "~3.3.3" + } +} diff --git a/src/main/webapp/static/dist/.htaccess b/src/main/webapp/static/dist/.htaccess new file mode 100644 index 000000000..39e27ed14 --- /dev/null +++ b/src/main/webapp/static/dist/.htaccess @@ -0,0 +1,935 @@ +# Apache Server Configs v2.11.0 | MIT License +# https://github.com/h5bp/server-configs-apache + +# (!) Using `.htaccess` files slows down Apache, therefore, if you have +# access to the main server configuration file (which is usually called +# `httpd.conf`), you should add this logic there. +# +# https://httpd.apache.org/docs/current/howto/htaccess.html. + +# ###################################################################### +# # CROSS-ORIGIN # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Cross-origin requests | +# ---------------------------------------------------------------------- + +# Allow cross-origin requests. +# +# https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS +# http://enable-cors.org/ +# http://www.w3.org/TR/cors/ + +# +# Header set Access-Control-Allow-Origin "*" +# + +# ---------------------------------------------------------------------- +# | Cross-origin images | +# ---------------------------------------------------------------------- + +# Send the CORS header for images when browsers request it. +# +# https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image +# https://blog.chromium.org/2011/07/using-cross-domain-images-in-webgl-and.html + + + + + SetEnvIf Origin ":" IS_CORS + Header set Access-Control-Allow-Origin "*" env=IS_CORS + + + + +# ---------------------------------------------------------------------- +# | Cross-origin web fonts | +# ---------------------------------------------------------------------- + +# Allow cross-origin access to web fonts. + + + + Header set Access-Control-Allow-Origin "*" + + + +# ---------------------------------------------------------------------- +# | Cross-origin resource timing | +# ---------------------------------------------------------------------- + +# Allow cross-origin access to the timing information for all resources. +# +# If a resource isn't served with a `Timing-Allow-Origin` header that +# would allow its timing information to be shared with the document, +# some of the attributes of the `PerformanceResourceTiming` object will +# be set to zero. +# +# http://www.w3.org/TR/resource-timing/ +# http://www.stevesouders.com/blog/2014/08/21/resource-timing-practical-tips/ + +# +# Header set Timing-Allow-Origin: "*" +# + + +# ###################################################################### +# # ERRORS # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Custom error messages/pages | +# ---------------------------------------------------------------------- + +# Customize what Apache returns to the client in case of an error. +# https://httpd.apache.org/docs/current/mod/core.html#errordocument + +# ErrorDocument 404 /404.html + +# ---------------------------------------------------------------------- +# | Error prevention | +# ---------------------------------------------------------------------- + +# Disable the pattern matching based on filenames. +# +# This setting prevents Apache from returning a 404 error as the result +# of a rewrite when the directory with the same name does not exist. +# +# https://httpd.apache.org/docs/current/content-negotiation.html#multiviews + +Options -MultiViews + + +# ###################################################################### +# # INTERNET EXPLORER # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Document modes | +# ---------------------------------------------------------------------- + +# Force Internet Explorer 8/9/10 to render pages in the highest mode +# available in the various cases when it may not. +# +# https://hsivonen.fi/doctype/#ie8 +# +# (!) Starting with Internet Explorer 11, document modes are deprecated. +# If your business still relies on older web apps and services that were +# designed for older versions of Internet Explorer, you might want to +# consider enabling `Enterprise Mode` throughout your company. +# +# http://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode +# http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx + + + Header set X-UA-Compatible "IE=edge" + # `mod_headers` cannot match based on the content-type, however, + # the `X-UA-Compatible` response header should be send only for + # HTML documents and not for the other resources. + + Header unset X-UA-Compatible + + + +# ---------------------------------------------------------------------- +# | Iframes cookies | +# ---------------------------------------------------------------------- + +# Allow cookies to be set from iframes in Internet Explorer. +# +# http://msdn.microsoft.com/en-us/library/ms537343.aspx +# http://www.w3.org/TR/2000/CR-P3P-20001215/ + +# +# Header set P3P "policyref=\"/w3c/p3p.xml\", CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"" +# + + +# ###################################################################### +# # MEDIA TYPES AND CHARACTER ENCODINGS # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Media types | +# ---------------------------------------------------------------------- + +# Serve resources with the proper media types (f.k.a. MIME types). +# +# https://www.iana.org/assignments/media-types/media-types.xhtml +# https://httpd.apache.org/docs/current/mod/mod_mime.html#addtype + + + + # Data interchange + + AddType application/json json map topojson + AddType application/ld+json jsonld + AddType application/vnd.geo+json geojson + AddType application/xml atom rdf rss xml + + + # JavaScript + + # Normalize to standard type. + # https://tools.ietf.org/html/rfc4329#section-7.2 + + AddType application/javascript js + + + # Manifest files + + # If you are providing a web application manifest file (see + # the specification: https://w3c.github.io/manifest/), it is + # recommended that you serve it with the `application/manifest+json` + # media type. + # + # Because the web application manifest file doesn't have its + # own unique file extension, you can set its media type either + # by matching: + # + # 1) the exact location of the file (this can be done using a + # directive such as ``, but it will NOT work in + # the `.htaccess` file, so you will have to do it in the main + # server configuration file or inside of a `` + # container) + # + # e.g.: + # + # + # AddType application/manifest+json json + # + # + # 2) the filename (this can be problematic as you will need to + # ensure that you don't have any other file with the same name + # as the one you gave to your web application manifest file) + # + # e.g.: + # + # + # AddType application/manifest+json json + # + + AddType application/x-web-app-manifest+json webapp + AddType text/cache-manifest appcache manifest + + + # Media files + + AddType audio/mp4 f4a f4b m4a + AddType audio/ogg oga ogg opus + AddType image/bmp bmp + AddType image/webp webp + AddType video/mp4 f4v f4p m4v mp4 + AddType video/ogg ogv + AddType video/webm webm + AddType video/x-flv flv + AddType image/svg+xml svg svgz + + # Serving `.ico` image files with a different media type + # prevents Internet Explorer from displaying then as images: + # https://github.com/h5bp/html5-boilerplate/commit/37b5fec090d00f38de64b591bcddcb205aadf8ee + + AddType image/x-icon cur ico + + + # Web fonts + + AddType application/font-woff woff + AddType application/font-woff2 woff2 + AddType application/vnd.ms-fontobject eot + + # Browsers usually ignore the font media types and simply sniff + # the bytes to figure out the font type. + # https://mimesniff.spec.whatwg.org/#matching-a-font-type-pattern + # + # However, Blink and WebKit based browsers will show a warning + # in the console if the following font types are served with any + # other media types. + + AddType application/x-font-ttf ttc ttf + AddType font/opentype otf + + + # Other + + AddType application/octet-stream safariextz + AddType application/x-bb-appworld bbaw + AddType application/x-chrome-extension crx + AddType application/x-opera-extension oex + AddType application/x-xpinstall xpi + AddType text/vcard vcard vcf + AddType text/vnd.rim.location.xloc xloc + AddType text/vtt vtt + AddType text/x-component htc + + + +# ---------------------------------------------------------------------- +# | Character encodings | +# ---------------------------------------------------------------------- + +# Serve all resources labeled as `text/html` or `text/plain` +# with the media type `charset` parameter set to `UTF-8`. +# +# https://httpd.apache.org/docs/current/mod/core.html#adddefaultcharset + +AddDefaultCharset utf-8 + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Serve the following file types with the media type `charset` +# parameter set to `UTF-8`. +# +# https://httpd.apache.org/docs/current/mod/mod_mime.html#addcharset + + + AddCharset utf-8 .atom \ + .bbaw \ + .css \ + .geojson \ + .js \ + .json \ + .jsonld \ + .rdf \ + .rss \ + .topojson \ + .vtt \ + .webapp \ + .xloc \ + .xml + + + +# ###################################################################### +# # REWRITES # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Rewrite engine | +# ---------------------------------------------------------------------- + +# (1) Turn on the rewrite engine (this is necessary in order for +# the `RewriteRule` directives to work). +# +# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#RewriteEngine +# +# (2) Enable the `FollowSymLinks` option if it isn't already. +# +# https://httpd.apache.org/docs/current/mod/core.html#options +# +# (3) If your web host doesn't allow the `FollowSymlinks` option, +# you need to comment it out or remove it, and then uncomment +# the `Options +SymLinksIfOwnerMatch` line (4), but be aware +# of the performance impact. +# +# https://httpd.apache.org/docs/current/misc/perf-tuning.html#symlinks +# +# (4) Some cloud hosting services will require you set `RewriteBase`. +# +# http://www.rackspace.com/knowledge_center/frequently-asked-question/why-is-modrewrite-not-working-on-my-site +# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritebase +# +# (5) Depending on how your server is set up, you may also need to +# use the `RewriteOptions` directive to enable some options for +# the rewrite engine. +# +# https://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions + + + + # (1) + RewriteEngine On + + # (2) + Options +FollowSymlinks + + # (3) + # Options +SymLinksIfOwnerMatch + + # (4) + # RewriteBase / + + # (5) + # RewriteOptions + + + +# ---------------------------------------------------------------------- +# | Forcing `https://` | +# ---------------------------------------------------------------------- + +# Redirect from the `http://` to the `https://` version of the URL. +# https://wiki.apache.org/httpd/RewriteHTTPToHTTPS + +# +# RewriteEngine On +# RewriteCond %{HTTPS} !=on +# RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] +# + +# ---------------------------------------------------------------------- +# | Suppressing / Forcing the `www.` at the beginning of URLs | +# ---------------------------------------------------------------------- + +# The same content should never be available under two different +# URLs, especially not with and without `www.` at the beginning. +# This can cause SEO problems (duplicate content), and therefore, +# you should choose one of the alternatives and redirect the other +# one. +# +# By default `Option 1` (no `www.`) is activated. +# http://no-www.org/faq.php?q=class_b +# +# If you would prefer to use `Option 2`, just comment out all the +# lines from `Option 1` and uncomment the ones from `Option 2`. +# +# (!) NEVER USE BOTH RULES AT THE SAME TIME! + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Option 1: rewrite www.example.com โ†’ example.com + + + RewriteEngine On + RewriteCond %{HTTPS} !=on + RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC] + RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L] + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Option 2: rewrite example.com โ†’ www.example.com +# +# Be aware that the following might not be a good idea if you use "real" +# subdomains for certain parts of your website. + +# +# RewriteEngine On +# RewriteCond %{HTTPS} !=on +# RewriteCond %{HTTP_HOST} !^www\. [NC] +# RewriteCond %{SERVER_ADDR} !=127.0.0.1 +# RewriteCond %{SERVER_ADDR} !=::1 +# RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] +# + + +# ###################################################################### +# # SECURITY # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Clickjacking | +# ---------------------------------------------------------------------- + +# Protect website against clickjacking. +# +# The example below sends the `X-Frame-Options` response header with +# the value `DENY`, informing browsers not to display the content of +# the web page in any frame. +# +# This might not be the best setting for everyone. You should read +# about the other two possible values the `X-Frame-Options` header +# field can have: `SAMEORIGIN` and `ALLOW-FROM`. +# https://tools.ietf.org/html/rfc7034#section-2.1. +# +# Keep in mind that while you could send the `X-Frame-Options` header +# for all of your websiteโ€™s pages, this has the potential downside that +# it forbids even non-malicious framing of your content (e.g.: when +# users visit your website using a Google Image Search results page). +# +# Nonetheless, you should ensure that you send the `X-Frame-Options` +# header for all pages that allow a user to make a state changing +# operation (e.g: pages that contain one-click purchase links, checkout +# or bank-transfer confirmation pages, pages that make permanent +# configuration changes, etc.). +# +# Sending the `X-Frame-Options` header can also protect your website +# against more than just clickjacking attacks: +# https://cure53.de/xfo-clickjacking.pdf. +# +# https://tools.ietf.org/html/rfc7034 +# http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx +# https://www.owasp.org/index.php/Clickjacking + +# +# Header set X-Frame-Options "DENY" +# # `mod_headers` cannot match based on the content-type, however, +# # the `X-Frame-Options` response header should be send only for +# # HTML documents and not for the other resources. +# +# Header unset X-Frame-Options +# +# + +# ---------------------------------------------------------------------- +# | Content Security Policy (CSP) | +# ---------------------------------------------------------------------- + +# Mitigate the risk of cross-site scripting and other content-injection +# attacks. +# +# This can be done by setting a `Content Security Policy` which +# whitelists trusted sources of content for your website. +# +# The example header below allows ONLY scripts that are loaded from the +# current website's origin (no inline scripts, no CDN, etc). That almost +# certainly won't work as-is for your website! +# +# For more details on how to craft a reasonable policy for your website, +# read: http://www.html5rocks.com/en/tutorials/security/content-security-policy/ +# (or the specification: http://www.w3.org/TR/CSP11/). Also, to make +# things easier, you can use an online CSP header generator such as: +# http://cspisawesome.com/. + +# +# Header set Content-Security-Policy "script-src 'self'; object-src 'self'" +# # `mod_headers` cannot match based on the content-type, however, +# # the `Content-Security-Policy` response header should be send +# # only for HTML documents and not for the other resources. +# +# Header unset Content-Security-Policy +# +# + +# ---------------------------------------------------------------------- +# | File access | +# ---------------------------------------------------------------------- + +# Block access to directories without a default document. +# +# You should leave the following uncommented, as you shouldn't allow +# anyone to surf through every directory on your server (which may +# includes rather private places such as the CMS's directories). + + + Options -Indexes + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Block access to all hidden files and directories with the exception of +# the visible content from within the `/.well-known/` hidden directory. +# +# These types of files usually contain user preferences or the preserved +# state of an utility, and can include rather private places like, for +# example, the `.git` or `.svn` directories. +# +# The `/.well-known/` directory represents the standard (RFC 5785) path +# prefix for "well-known locations" (e.g.: `/.well-known/manifest.json`, +# `/.well-known/keybase.txt`), and therefore, access to its visible +# content should not be blocked. +# +# https://www.mnot.net/blog/2010/04/07/well-known +# https://tools.ietf.org/html/rfc5785 + + + RewriteEngine On + RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] + RewriteCond %{SCRIPT_FILENAME} -d [OR] + RewriteCond %{SCRIPT_FILENAME} -f + RewriteRule "(^|/)\." - [F] + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +# Block access to files that can expose sensitive information. +# +# By default, block access to backup and source files that may be +# left by some text editors and can pose a security risk when anyone +# has access to them. +# +# http://feross.org/cmsploit/ +# +# (!) Update the `` regular expression from below to +# include any files that might end up on your production server and +# can expose sensitive information about your website. These files may +# include: configuration files, files that contain metadata about the +# project (e.g.: project dependencies), build scripts, etc.. + + + + # Apache < 2.3 + + Order allow,deny + Deny from all + Satisfy All + + + # Apache โ‰ฅ 2.3 + + Require all denied + + + + +# ---------------------------------------------------------------------- +# | HTTP Strict Transport Security (HSTS) | +# ---------------------------------------------------------------------- + +# Force client-side SSL redirection. +# +# If a user types `example.com` in their browser, even if the server +# redirects them to the secure version of the website, that still leaves +# a window of opportunity (the initial HTTP connection) for an attacker +# to downgrade or redirect the request. +# +# The following header ensures that browser will ONLY connect to your +# server via HTTPS, regardless of what the users type in the browser's +# address bar. +# +# (!) Remove the `includeSubDomains` optional directive if the website's +# subdomains are not using HTTPS. +# +# http://www.html5rocks.com/en/tutorials/security/transport-layer-security/ +# https://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14#section-6.1 +# http://blogs.msdn.com/b/ieinternals/archive/2014/08/18/hsts-strict-transport-security-attacks-mitigations-deployment-https.aspx + +# +# Header set Strict-Transport-Security "max-age=16070400; includeSubDomains" +# + +# ---------------------------------------------------------------------- +# | Reducing MIME type security risks | +# ---------------------------------------------------------------------- + +# Prevent some browsers from MIME-sniffing the response. +# +# This reduces exposure to drive-by download attacks and cross-origin +# data leaks, and should be left uncommented, especially if the server +# is serving user-uploaded content or content that could potentially be +# treated as executable by the browser. +# +# http://www.slideshare.net/hasegawayosuke/owasp-hasegawa +# http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-v-comprehensive-protection.aspx +# http://msdn.microsoft.com/en-us/library/ie/gg622941.aspx +# https://mimesniff.spec.whatwg.org/ + + + Header set X-Content-Type-Options "nosniff" + + +# ---------------------------------------------------------------------- +# | Reflected Cross-Site Scripting (XSS) attacks | +# ---------------------------------------------------------------------- + +# (1) Try to re-enable the cross-site scripting (XSS) filter built +# into most web browsers. +# +# The filter is usually enabled by default, but in some cases it +# may be disabled by the user. However, in Internet Explorer for +# example, it can be re-enabled just by sending the +# `X-XSS-Protection` header with the value of `1`. +# +# (2) Prevent web browsers from rendering the web page if a potential +# reflected (a.k.a non-persistent) XSS attack is detected by the +# filter. +# +# By default, if the filter is enabled and browsers detect a +# reflected XSS attack, they will attempt to block the attack +# by making the smallest possible modifications to the returned +# web page. +# +# Unfortunately, in some browsers (e.g.: Internet Explorer), +# this default behavior may allow the XSS filter to be exploited, +# thereby, it's better to inform browsers to prevent the rendering +# of the page altogether, instead of attempting to modify it. +# +# http://hackademix.net/2009/11/21/ies-xss-filter-creates-xss-vulnerabilities +# +# (!) Do not rely on the XSS filter to prevent XSS attacks! Ensure that +# you are taking all possible measures to prevent XSS attacks, the +# most obvious being: validating and sanitizing your website's inputs. +# +# http://blogs.msdn.com/b/ie/archive/2008/07/02/ie8-security-part-iv-the-xss-filter.aspx +# http://blogs.msdn.com/b/ieinternals/archive/2011/01/31/controlling-the-internet-explorer-xss-filter-with-the-x-xss-protection-http-header.aspx +# https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 + +# +# # (1) (2) +# Header set X-XSS-Protection "1; mode=block" +# # `mod_headers` cannot match based on the content-type, however, +# # the `X-XSS-Protection` response header should be send only for +# # HTML documents and not for the other resources. +# +# Header unset X-XSS-Protection +# +# + +# ---------------------------------------------------------------------- +# | Server software information | +# ---------------------------------------------------------------------- + +# Prevent Apache from sending in the `Server` response header its +# exact version number, the description of the generic OS-type or +# information about its compiled-in modules. +# +# (!) The `ServerTokens` directive will only work in the main server +# configuration file, so don't try to enable it in the `.htaccess` file! +# +# https://httpd.apache.org/docs/current/mod/core.html#servertokens + +# ServerTokens Prod + + +# ###################################################################### +# # WEB PERFORMANCE # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Compression | +# ---------------------------------------------------------------------- + + + + # Force compression for mangled `Accept-Encoding` request headers + # https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html + + + + SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding + RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding + + + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + # Compress all output labeled with one of the following media types. + # + # (!) For Apache versions below version 2.3.7 you don't need to + # enable `mod_filter` and can remove the `` + # and `` lines as `AddOutputFilterByType` is still in + # the core directives. + # + # https://httpd.apache.org/docs/current/mod/mod_filter.html#addoutputfilterbytype + + + AddOutputFilterByType DEFLATE "application/atom+xml" \ + "application/javascript" \ + "application/json" \ + "application/ld+json" \ + "application/manifest+json" \ + "application/rdf+xml" \ + "application/rss+xml" \ + "application/schema+json" \ + "application/vnd.geo+json" \ + "application/vnd.ms-fontobject" \ + "application/x-font-ttf" \ + "application/x-javascript" \ + "application/x-web-app-manifest+json" \ + "application/xhtml+xml" \ + "application/xml" \ + "font/eot" \ + "font/opentype" \ + "image/bmp" \ + "image/svg+xml" \ + "image/vnd.microsoft.icon" \ + "image/x-icon" \ + "text/cache-manifest" \ + "text/css" \ + "text/html" \ + "text/javascript" \ + "text/plain" \ + "text/vcard" \ + "text/vnd.rim.location.xloc" \ + "text/vtt" \ + "text/x-component" \ + "text/x-cross-domain-policy" \ + "text/xml" + + + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + # Map the following filename extensions to the specified + # encoding type in order to make Apache serve the file types + # with the appropriate `Content-Encoding` response header + # (do note that this will NOT make Apache compress them!). + # + # If these files types would be served without an appropriate + # `Content-Enable` response header, client applications (e.g.: + # browsers) wouldn't know that they first need to uncompress + # the response, and thus, wouldn't be able to understand the + # content. + # + # https://httpd.apache.org/docs/current/mod/mod_mime.html#addencoding + + + AddEncoding gzip svgz + + + + +# ---------------------------------------------------------------------- +# | Content transformation | +# ---------------------------------------------------------------------- + +# Prevent intermediate caches or proxies (e.g.: such as the ones +# used by mobile network providers) from modifying the website's +# content. +# +# https://tools.ietf.org/html/rfc2616#section-14.9.5 +# +# (!) If you are using `mod_pagespeed`, please note that setting +# the `Cache-Control: no-transform` response header will prevent +# `PageSpeed` from rewriting `HTML` files, and, if the +# `ModPagespeedDisableRewriteOnNoTransform` directive isn't set +# to `off`, also from rewriting other resources. +# +# https://developers.google.com/speed/pagespeed/module/configuration#notransform + +# +# Header merge Cache-Control "no-transform" +# + +# ---------------------------------------------------------------------- +# | ETags | +# ---------------------------------------------------------------------- + +# Remove `ETags` as resources are sent with far-future expires headers. +# +# https://developer.yahoo.com/performance/rules.html#etags +# https://tools.ietf.org/html/rfc7232#section-2.3 + +# `FileETag None` doesn't work in all cases. + + Header unset ETag + + +FileETag None + +# ---------------------------------------------------------------------- +# | Expires headers | +# ---------------------------------------------------------------------- + +# Serve resources with far-future expires headers. +# +# (!) If you don't control versioning with filename-based +# cache busting, you should consider lowering the cache times +# to something like one week. +# +# https://httpd.apache.org/docs/current/mod/mod_expires.html + + + + ExpiresActive on + ExpiresDefault "access plus 1 month" + + # CSS + ExpiresByType text/css "access plus 1 year" + + # Data interchange + ExpiresByType application/atom+xml "access plus 1 hour" + ExpiresByType application/rdf+xml "access plus 1 hour" + ExpiresByType application/rss+xml "access plus 1 hour" + + ExpiresByType application/json "access plus 0 seconds" + ExpiresByType application/ld+json "access plus 0 seconds" + ExpiresByType application/schema+json "access plus 0 seconds" + ExpiresByType application/vnd.geo+json "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType text/xml "access plus 0 seconds" + + # Favicon (cannot be renamed!) and cursor images + ExpiresByType image/vnd.microsoft.icon "access plus 1 week" + ExpiresByType image/x-icon "access plus 1 week" + + # HTML + ExpiresByType text/html "access plus 0 seconds" + + # JavaScript + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType application/x-javascript "access plus 1 year" + ExpiresByType text/javascript "access plus 1 year" + + # Manifest files + ExpiresByType application/manifest+json "access plus 1 year" + + ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" + ExpiresByType text/cache-manifest "access plus 0 seconds" + + # Media files + ExpiresByType audio/ogg "access plus 1 month" + ExpiresByType image/bmp "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType video/mp4 "access plus 1 month" + ExpiresByType video/ogg "access plus 1 month" + ExpiresByType video/webm "access plus 1 month" + + # Web fonts + + # Embedded OpenType (EOT) + ExpiresByType application/vnd.ms-fontobject "access plus 1 month" + ExpiresByType font/eot "access plus 1 month" + + # OpenType + ExpiresByType font/opentype "access plus 1 month" + + # TrueType + ExpiresByType application/x-font-ttf "access plus 1 month" + + # Web Open Font Format (WOFF) 1.0 + ExpiresByType application/font-woff "access plus 1 month" + ExpiresByType application/x-font-woff "access plus 1 month" + ExpiresByType font/woff "access plus 1 month" + + # Web Open Font Format (WOFF) 2.0 + ExpiresByType application/font-woff2 "access plus 1 month" + + # Other + ExpiresByType text/x-cross-domain-policy "access plus 1 week" + + + +# ---------------------------------------------------------------------- +# | File concatenation | +# ---------------------------------------------------------------------- + +# Allow concatenation from within specific files. +# +# e.g.: +# +# If you have the following lines in a file called, for +# example, `main.combined.js`: +# +# +# +# +# Apache will replace those lines with the content of the +# specified files. + +# +# +# Options +Includes +# AddOutputFilterByType INCLUDES application/javascript \ +# application/x-javascript \ +# text/javascript +# SetOutputFilter INCLUDES +# +# +# Options +Includes +# AddOutputFilterByType INCLUDES text/css +# SetOutputFilter INCLUDES +# +# + +# ---------------------------------------------------------------------- +# | Filename-based cache busting | +# ---------------------------------------------------------------------- + +# If you're not using a build process to manage your filename version +# revving, you might want to consider enabling the following directives +# to route all requests such as `/style.12345.css` to `/style.css`. +# +# To understand why this is important and even a better solution than +# using something like `*.css?v231`, please see: +# http://www.stevesouders.com/blog/2008/08/23/revving-filenames-dont-use-querystring/ + +# +# RewriteEngine On +# RewriteCond %{REQUEST_FILENAME} !-f +# RewriteRule ^(.+)\.(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp)$ $1.$3 [L] +# diff --git a/src/main/webapp/static/dist/dashboard.html b/src/main/webapp/static/dist/dashboard.html new file mode 100644 index 000000000..7785189b2 --- /dev/null +++ b/src/main/webapp/static/dist/dashboard.html @@ -0,0 +1,8 @@ + Pet Clinic - Dashboard

Welcome, John Doe

When youโ€™re ready, you may start adding a new pet owner or continue browsing.

Browse Owners

Generic placeholder image

Eduardo Rodriguez

2693 Commerce St., McFarland

+6085558763

  • Generic placeholder image
Generic placeholder image

Eduardo Rodriguez

2693 Commerce St., McFarland

+6085558763

  • Generic placeholder image
Generic placeholder image

Eduardo Rodriguez

2693 Commerce St., McFarland

+6085558763

  • Generic placeholder image
Generic placeholder image

Eduardo Rodriguez

2693 Commerce St., McFarland

+6085558763

  • Generic placeholder image

Pets

Generic placeholder image

Basil

08 August 2012

Hamster

Generic placeholder image

Basil

08 August 2012

Hamster

Generic placeholder image

Basil

08 August 2012

Hamster

Generic placeholder image

Basil

08 August 2012

Hamster

Veterinarians

Generic placeholder image

Helen Leary

+6085558763

Surgery

Generic placeholder image

Helen Leary

+6085558763

Surgery

Generic placeholder image

Helen Leary

+6085558763

Surgery

Generic placeholder image

Helen Leary

+6085558763

Surgery

\ No newline at end of file diff --git a/src/main/webapp/static/dist/discover.html b/src/main/webapp/static/dist/discover.html new file mode 100644 index 000000000..9e8f2f43e --- /dev/null +++ b/src/main/webapp/static/dist/discover.html @@ -0,0 +1,8 @@ + Pet Clinic - Discover Pet Owners on your Neigborhood

Discover Pet Owners

Helping you discover pet owners near you and connect.

Generic placeholder image

Thumbnail label

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

Generic placeholder image

Thumbnail label

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

Generic placeholder image

Thumbnail label

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

Generic placeholder image

Thumbnail label

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

Generic placeholder image

Thumbnail label

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

Generic placeholder image

Thumbnail label

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

Generic placeholder image

Thumbnail label

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

Generic placeholder image

Thumbnail label

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

Over 40,000 pet owners trust us. Register now. It's Free forever!

Use it as a starting point to create something more unique.

Business Hours

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

Our Location

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

Questions or comments

Cras mattis consectetur purus sit amet fermentum.

Drop us a line

\ No newline at end of file diff --git a/src/main/webapp/static/dist/favicon.ico b/src/main/webapp/static/dist/favicon.ico new file mode 100644 index 000000000..04c64a9d8 Binary files /dev/null and b/src/main/webapp/static/dist/favicon.ico differ diff --git a/src/main/webapp/static/dist/images/avatar.jpg b/src/main/webapp/static/dist/images/avatar.jpg new file mode 100644 index 000000000..b3373bb3a Binary files /dev/null and b/src/main/webapp/static/dist/images/avatar.jpg differ diff --git a/src/main/webapp/static/dist/images/logo.png b/src/main/webapp/static/dist/images/logo.png new file mode 100644 index 000000000..e54475588 Binary files /dev/null and b/src/main/webapp/static/dist/images/logo.png differ diff --git a/src/main/webapp/static/dist/images/owner-default.png b/src/main/webapp/static/dist/images/owner-default.png new file mode 100644 index 000000000..f1691bbe0 Binary files /dev/null and b/src/main/webapp/static/dist/images/owner-default.png differ diff --git a/src/main/webapp/static/dist/images/pet-default.png b/src/main/webapp/static/dist/images/pet-default.png new file mode 100644 index 000000000..20b986bd7 Binary files /dev/null and b/src/main/webapp/static/dist/images/pet-default.png differ diff --git a/src/main/webapp/static/dist/images/pet-small.png b/src/main/webapp/static/dist/images/pet-small.png new file mode 100644 index 000000000..9bc6928b3 Binary files /dev/null and b/src/main/webapp/static/dist/images/pet-small.png differ diff --git a/src/main/webapp/static/dist/images/veterinarian-default.jpg b/src/main/webapp/static/dist/images/veterinarian-default.jpg new file mode 100644 index 000000000..507842e8d Binary files /dev/null and b/src/main/webapp/static/dist/images/veterinarian-default.jpg differ diff --git a/src/main/webapp/static/dist/index.html b/src/main/webapp/static/dist/index.html new file mode 100644 index 000000000..202c97b5d --- /dev/null +++ b/src/main/webapp/static/dist/index.html @@ -0,0 +1,8 @@ + Pet Clinic

Pet care for the People who love them

PetClinic is here to enhance people's relationships with their pets

Learn more

Our Veterinarians

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

Generic placeholder image

Thumbnail label

Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts.

Generic placeholder image

Thumbnail label

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

Generic placeholder image

Thumbnail label

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

Generic placeholder image

Thumbnail label

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum.

Generic placeholder image

Thumbnail label

Mountains, she had a last view back on the skyline of her hometown Bookmarksgrove, the headline of Alphabet Village and the subline of her own road, the Line Lane.

Generic placeholder image

Thumbnail label

The Big Oxmox advised her not to do so, because there were thousands of bad Commas, wild Question Marks and devious Semikoli.

Generic placeholder image

Services One

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

Learn more ยป

Services Two

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

Learn more ยป

Generic placeholder image
Generic placeholder image

Services Three

A small river named Duden flows by their place and supplies it with the necessary regelialia. It is a paradisematic country, in which roasted parts of sentences fly into your mouth.

Learn more ยป

What our customers are saying.

Even the all-powerful Pointing has no control about the blind texts it is an almost unorthographic life One day however a small line of blind text by the name of Lorem Ipsum decided to leave for the far World of Grammar.

Generic placeholder image

Client One

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

Generic placeholder image

Client Two

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

Generic placeholder image

Client Three

Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

Trusted by some of the world's smartest companies

Companies placeholder image
Companies placeholder image
Companies placeholder image
Companies placeholder image
Companies placeholder image
Companies placeholder image

Over 40,000 pet owners trust us.

Use it as a starting point to create something more unique.

Business Hours

Donec sed odio dui. Etiam porta sem malesuada magna mollis euismod. Nullam id dolor id nibh ultricies vehicula ut id elit. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Praesent commodo cursus magna.

Our Location

Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Cras mattis consectetur purus sit amet fermentum. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh.

Questions or comments

Cras mattis consectetur purus sit amet fermentum.

Drop us a line

Tell your friends: Facebook, Twitter, Google+

ยฉ 2015 Pet Clinic, A Spring Framework Demonstration

\ No newline at end of file diff --git a/src/main/webapp/static/dist/robots.txt b/src/main/webapp/static/dist/robots.txt new file mode 100644 index 000000000..ee2cc216a --- /dev/null +++ b/src/main/webapp/static/dist/robots.txt @@ -0,0 +1,3 @@ +# robotstxt.org/ + +User-agent: * diff --git a/src/main/webapp/static/dist/scripts/main.js b/src/main/webapp/static/dist/scripts/main.js new file mode 100644 index 000000000..96e0f4204 --- /dev/null +++ b/src/main/webapp/static/dist/scripts/main.js @@ -0,0 +1 @@ +"use strict";function scrollNav(){$(".js-scroll-nav").click(function(){return $("html, body").stop().animate({scrollTop:$($(this).attr("href")).offset().top-20},1e3),!1})}$(function(){scrollNav()}); \ No newline at end of file diff --git a/src/main/webapp/static/dist/scripts/vendor.js b/src/main/webapp/static/dist/scripts/vendor.js new file mode 100644 index 000000000..5eb68087e --- /dev/null +++ b/src/main/webapp/static/dist/scripts/vendor.js @@ -0,0 +1,3 @@ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){function c(a){var b=a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(hb.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=ob[a]={};return _.each(a.match(nb)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+h.uid++}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ub,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:tb.test(c)?_.parseJSON(c):c}catch(e){}sb.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Kb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)rb.set(a[c],"globalEval",!b||rb.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(rb.hasData(a)&&(f=rb.access(a),g=rb.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sb.hasData(a)&&(h=sb.access(a),i=_.extend({},h),sb.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&yb.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Ob[a];return c||(c=t(a,b),"none"!==c&&c||(Nb=(Nb||_("